尝试打开文件时,跨不同Android版本的不同URI方案

时间:2016-04-28 10:24:04

标签: java android android-intent

我正在尝试使用我的应用从外部存储打开文件。 我正在使用Share via功能。

我的代码导出

File filelocation = new File(sPath);
Uri path = Uri.fromFile(filelocation);
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("vnd.android.cursor.dir/email");

emailIntent.putExtra(Intent.EXTRA_STREAM, path);
String mystring = ctx.getResources().getString(R.string.Import_rule);
emailIntent.putExtra(Intent.EXTRA_TEXT, mystring);

导入功能

if (Intent.ACTION_SEND.equals(in.getAction()))
{
    uri = (Uri) in.getParcelableExtra(Intent.EXTRA_STREAM);

   uri.getPath();

}

当我尝试获取uri.getPath()时,我发现不同设备版本存在差异。

Android 5.0中的

:devicve:

file:///storage/emulated/0/Download/DeviceList.zip

在Android 6.0设备中

content://0@media/external/file/1147
  • 我不知道为什么不同版本的URI方案有所不同?

  • 我该如何解决这个问题?

  • 您能告诉我如何从内容中读取并保存为文件

1 个答案:

答案 0 :(得分:1)

  

我不知道为什么不同版本的URI方案不同?

自Android 1.0以来,

content一直是一个有效的方案。由于更好的安全性,它多年来一直是优选的。它将来会变得非常重要,如Android N is beginning to ban file Uri values

此外,请注意,方案的更改与Android OS版本没什么关系。它更多地与您用于触发ACTION_SEND Intent的应用版本有关。

  

我该如何解决这个问题?

支持他们两个。

  

您能告诉我如何从内容中读取并保存为文件

Use ContentResolver and openInputStream()获取InputStream指向的内容Uri。然后,使用Java I / O将该数据复制到本地文件。