简体   繁体   English

在Android中使用Intent无法从SD卡打开文件

[英]File not open from sd-card using intent in android

I tried many ways to open file but I'm not able to open file from sd-card using intent. 我尝试了多种方法来打开文件,但无法使用Intent从SD卡中打开文件。

From internal memory easily open file, but from sd-card file open is difficult. 从内部存储器很容易打开文件,但是从sd卡文件打开很难。 Also able to open file from web-url. 也可以从网址中打开文件。

Permission : 权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

b = true -> file uri b = true->文件uri

b = false -> web url b =否->网站网址

url = /mnt/media_rw/9016-4EF8/123.pdf 网址= /mnt/media_rw/9016-4EF8/123.pdf

Here is my code for open file from sd-card: 这是我从SD卡打开文件的代码:

 public static void openFile(Activity context, String url, Boolean b) throws
 IOException 

{


    File file = new File(url);

    Uri uri=null;


    if (b)
        uri = Uri.fromFile(file);
    else
        uri = Uri.parse(url);


    Intent intent = new Intent(Intent.ACTION_VIEW);


    if (url.toString().toLowerCase().contains(".doc") || url.toString().toLowerCase().contains(".docx")) {
        // Word document
        intent.setDataAndType(uri, "application/msword");
    } else if (url.toString().toLowerCase().contains(".pdf")) {
        // PDF file
        intent.setDataAndType(uri, "application/pdf");
    } else if (url.toString().toLowerCase().contains(".ppt") || url.toString().toLowerCase().contains(".pptx")) {
        // Powerpoint file
        intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
    } else if (url.toString().toLowerCase().contains(".xls") || url.toString().toLowerCase().contains(".xlsx")) {
        // Excel file
        intent.setDataAndType(uri, "application/vnd.ms-excel");
    } else if (url.toString().toLowerCase().contains(".zip") || url.toString().toLowerCase().contains(".rar")) {
        // WAV audio file
        intent.setDataAndType(uri, "application/x-wav");
    } else if (url.toString().toLowerCase().contains(".rtf")) {
        // RTF file
        intent.setDataAndType(uri, "application/rtf");
    } else if (url.toString().toLowerCase().contains(".wav") || url.toString().toLowerCase().contains(".mp3")) {
        // WAV audio file
        intent.setDataAndType(uri, "audio/x-wav");
    } else if (url.toString().toLowerCase().contains(".gif")) {
        // GIF file
        intent.setDataAndType(uri, "image/gif");
    } else if (url.toString().toLowerCase().toLowerCase().contains(".jpg") || url.toString().toLowerCase().contains(".jpeg") || url.toString().toLowerCase().contains(".png")) {
        //JPG file
        intent.setDataAndType(uri, "image/*");
    } else if (url.toString().toLowerCase().contains(".txt")) {
        // Text file
        intent.setDataAndType(uri, "text/plain");
    } else if (url.toString().toLowerCase().contains(".3gp") || url.toString().toLowerCase().contains(".mpg") || url.toString().toLowerCase().contains(".mpeg") || url.toString().toLowerCase().contains(".mpe") || url.toString().toLowerCase().contains(".mp4") || url.toString().toLowerCase().contains(".avi")) {
        // Video files
        intent.setDataAndType(uri, "video/*");
    } else {
        intent.setDataAndType(uri, "*/*");
    }
    //intent.setDataAndType(uri, "application/*");


    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


    try {
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
        Log.e("Error -> ", e + "");
    }
}

Output: 输出:

File not open using intent 使用意图无法打开文件

Try using this, 

 File dir    =   new File (Environment.getExternalStorageDirectory().getAbsolutePath() + "/PersonData");
 File file   =   new File(dir, "Data.pdf");

Here "PersonData" is the folder inside sdcard, and the filename is Data.pdf 这里的“ PersonData”是sdcard内的文件夹,文件名是Data.pdf

看来您应该像这样通过Intent传递url:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);

Be sure <uses-permission 's place. 确保<uses-permission的位置。 It should be like below; 它应该像下面这样;

 <manifest>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <application>
             <activity> 
              ...
             </activity>
      </application>
  </manifest> 

You do not have direct filesystem access to arbitrary locations on removable storage , starting with Android 4.4. 从Android 4.4开始,您无法直接访问可移动存储上任意位置的文件系统。

Since nothing on Android 4.4+ should be giving you that filesystem path, this normally will not be a problem. 由于Android 4.4+上的任何内容都无法为您提供该文件系统路径,因此通常不会出现问题。 It will be a problem if you are hard-coding that path, since you do not have access to that location. 如果您要对该路径进行硬编码,将是一个问题,因为您无权访问该位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM