当前位置: 首页 > 知识库问答 >
问题:

Android中的FileUriExposedException[副本]

赖鸿羲
2023-03-14

我需要打开包含图像的内部存储文件夹。

 File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),  "MyPhotos");
Intent intent = new Intent(Intent.ACTION_VIEW);
String path =folder.getPath();
Uri myImagesdir = Uri.parse("file://" + path );
intent.setDataAndType(myImagesdir,"*/*");   
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
 <paths xmlns:android="http://schemas.android.com/apk/res/android">
     <external-path name="images" path="Pictures" />
     <external-path name="external_files" path="."/>
     <external-path name="files_root" path="Android/data/${applicationId}"/> </paths>

清单

  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.android.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

xml/file_paths

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="images" path="Pictures" />
    <external-path name="external_files" path="."/>
    <external-path name="files_root" path="Android/data/${applicationId}"/>
</paths>

错误

Uri myImagesdir = Uri.parse("file://" + path );
 Uri myImagesdir = Uri.parse("content://" + path );

无论如何,我必须选择始终应用程序打开这个文件夹。

是否可以默认使用我的文件应用程序打开某个文件夹?

共有1个答案

谷泳
2023-03-14

是否可以默认使用我的文件应用程序打开某个文件夹?

是的&不是的,它并不是100%保证它能在所有设备上工作。

编辑1:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri dirUri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName() + ".com.example.myapplication",Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        //intent.setDataAndtType(); I will change this value in the alternatives below
    }
<provider
        android:name=".GenericFileProvider"
        android:authorities="${applicationId}.com.example.myapplication"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>
public class GenericFileProvider extends FileProvider {
}
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

上述方法对三星这样的大公司不起作用

1.使用类型documentscontract.document.mime_type_dir

Intent.SetDataAndType(dirUri,DocumentsContract.Document.MIME_TYPE_DIR);

2.使用类型资源/文件夹

Intent.SetDataAndType(dirUri,“资源/文件夹”);

这种方法只有在用户安装了ES文件资源管理器应用程序时才起作用。

if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent);
} else {
   // either display error or take necessary action
}

Intent.SetDataAndType(dirUri,“*/*”);

如果用户从意图选择器中选择File Manager应用程序,并将其标记为处理*/*的默认应用程序,则此方法有效。然而,它也有一些缺点(感谢@commonsware将其中的一些缺点带了出来):

  • 此类型将加载设备上的所有应用程序,并允许用户选择其中一个来完成操作。
  • 如果没有文件资源管理器,用户选择其他应用程序加载您的意图,那么其他应用程序将崩溃或只是显示黑屏。例如。如果您使用Gallery或其他应用程序而不是file explorer,那么Gallery应用程序将崩溃或显示黑屏。
  • 即使有文件资源管理器,但用户决定使用其他应用程序,其他应用程序也可能崩溃

这里有一些特定于设备的实现,正如@Academy of Programmer所提到的,它需要识别默认文件管理器的意图和额外的需要。

由于文件管理器目前还没有支持特定类型的标准,因此没有标准类型可用于实现它。未来谷歌可能会想出一些办法。最好的选择是实现您自己的文件管理器,就像Dropbox或Google Drive所做的那样。有几个库提供了此功能。

 类似资料: