ACTION_VIEW intent for a file with unknown MimeType

后端 未结 13 1617
抹茶落季
抹茶落季 2020-11-27 10:57

My app has a feature that browse files on your phone and SD card and open them using other apps. I want a solution where I don\'t have to specify the MimeType and can work w

相关标签:
13条回答
  • 2020-11-27 11:46

    You have to use the MimeTypeMap and get the type using the file extension. Then pass it to intent to open any type of file.

    Kotlin

    fun getIntentForFile(filePath: String, context: Context): Intent {
        val intent = Intent()
    
        val uri = FileProvider.getUriForFile(
            context,
            context.applicationContext.packageName + ".fileprovider",
            File(filePath)
        )
        intent.action = Intent.ACTION_VIEW
        intent.putExtra(Intent.EXTRA_STREAM, uri)
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        intent.setDataAndType(uri, getFileContentType(filePath))
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        return intent
    }
    
    fun getFileContentType(filePath: String): String? {
        val file = File(filePath)
        val map = MimeTypeMap.getSingleton()
        val ext = MimeTypeMap.getFileExtensionFromUrl(file.name)
        var type = map.getMimeTypeFromExtension(ext)
        if (type == null) type = "*/*"
        return type
    }
    
    0 讨论(0)
  • 2020-11-27 11:48

    try this one almost covers all file extensions

      public void openFile(File url) {
    
        Uri uri = Uri.fromFile(url);
    
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
            // Word document
            intent.setDataAndType(uri, "application/msword");
        } else if (url.toString().contains(".pdf")) {
            // PDF file
            intent.setDataAndType(uri, "application/pdf");
        } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
            // Powerpoint file
            intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
            // Excel file
            intent.setDataAndType(uri, "application/vnd.ms-excel");
        } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) {
            // WAV audio file
            intent.setDataAndType(uri, "application/x-wav");
        } else if (url.toString().contains(".rtf")) {
            // RTF file
            intent.setDataAndType(uri, "application/rtf");
        } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) {
            // WAV audio file
            intent.setDataAndType(uri, "audio/x-wav");
        } else if (url.toString().contains(".gif")) {
            // GIF file
            intent.setDataAndType(uri, "image/gif");
        } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
            // JPG file
            intent.setDataAndType(uri, "image/jpeg");
        } else if (url.toString().contains(".txt")) {
            // Text file
            intent.setDataAndType(uri, "text/plain");
        } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
            // Video files
            intent.setDataAndType(uri, "video/*");
        } else {
            //if you want you can also define the intent type for any other file
            //additionally use else clause below, to manage other unknown extensions
            //in this case, Android will show all applications installed on the device
            //so you can choose which application to use
            intent.setDataAndType(uri, "*/*");
        }
    
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    
    }
    
    0 讨论(0)
  • 2020-11-27 11:58
    Intent myIntent = new Intent(Intent.ACTION_VIEW);
    String mime=URLConnection.guessContentTypeFromStream(new FileInputStream(item));
    if(mime==null) mime=URLConnection.guessContentTypeFromName(item.getName());
    myIntent.setDataAndType(Uri.fromFile(item), mime);
    startActivity(myIntent);
    

    At first I try to guess with the file content, but as i see it always returns null.

    0 讨论(0)
  • 2020-11-27 11:59

    createChooser should do the trick:

    Intent myIntent = new Intent(Intent.ACTION_VIEW);
    myIntent.setData(Uri.fromFile(item));
    Intent j = Intent.createChooser(myIntent, "Choose an application to open with:");
    startActivity(j);
    
    0 讨论(0)
  • 2020-11-27 11:59

    Simple share file ("multipart/")

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
    intent.setType("multipart/");
    startActivity(intent);
    
    0 讨论(0)
  • 2020-11-27 11:59

    This will work surely..

     private void showFile(File file, String filetype) 
    {
                    MimeTypeMap myMime = MimeTypeMap.getSingleton();
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    String mimeType = 
                    myMime.getMimeTypeFromExtension(filetype);
                    if(android.os.Build.VERSION.SDK_INT >=24) {
                     Uri fileURI = FileProvider.getUriForFile(getContext(),
                                BuildConfig.APPLICATION_ID + ".provider",
                                file);
                        intent.setDataAndType(fileURI, mimeType);
    
                    }else {
                        intent.setDataAndType(Uri.fromFile(file), mimeType);
                    }
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    try {
                        context.startActivity(intent);
                    }catch (ActivityNotFoundException e){
                        Toast.makeText(context, "No Application found to open this type of file.", Toast.LENGTH_LONG).show();
    
                    }
                }
    
    0 讨论(0)
提交回复
热议问题