【问题标题】:File not open from sd-card using intent in android文件未在 android 中使用意图从 sd 卡打开
【发布时间】:2016-12-27 11:07:29
【问题描述】:

我尝试了多种打开文件的方法,但无法使用 Intent 从 sd 卡打开文件。

从内存中打开文件很容易,但从 sd 卡文件打开很困难。 也可以从 web-url 打开文件。

权限:

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

b = true -> 文件 uri

b = false -> 网址

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

这是我从 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 + "");
    }
}

输出:

文件未使用意图打开

【问题讨论】:

  • 您是否声明了从 sdcard 读取的权限,即&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;
  • 我同时分配了两个权限
  • 尝试使用,Environment.getExternalStorageDirectory()
  • 完整的错误信息是什么?
  • Environment.getExternalStorageDirectory() 给我内部存储路径,我想从存储卡打开文件

标签: android android-intent


【解决方案1】:
Try using this, 

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

这里的“PersonData”是sdcard里面的文件夹,文件名是Data.pdf

【讨论】:

  • 找不到文件(/storage/emulated/0/PersonData/Data.pdf:打开失败:ENOENT(没有这样的文件或目录))
  • 我从存储卡中得到了 path = /mnt/media_rw/9016-4EF8/PersonData/Data.pdf
  • 在我的项目中,首先我在附加后附加任何类型的文档(如 doc、pdf、mp3、mp4 等),然后单击附件打开此文档,并使用内部存储器附件的默认意图打开此文档运行完成,但无法打开存储卡附件
  • 你是在模拟器中运行,在真机上试试。确保您有名为 PersonData 的文件夹和其中的 Data.pdf。
  • 不,我在我的 fone 中运行
【解决方案2】:

看来你应该像这样在 Intent 中传递你的 url:

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

【讨论】:

  • 找不到文件 (/mnt/media_rw/9016-4EF8/123.pdf) 打开失败 EACCESS (权限被拒绝) 这里我授予权限以及 /mnt/media_rw/9016-4EF8/ 的文件123.pdf
【解决方案3】:

确定&lt;uses-permission 的位置。它应该如下所示;

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

【讨论】:

【解决方案4】:

从 Android 4.4 开始,您无法直接访问 removable storage 上的任意位置。

由于 Android 4.4+ 上没有任何内容应该为您提供该文件系统路径,因此这通常不会成为问题。如果您对该路径进行硬编码,这将是一个问题,因为您无权访问该位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多