Android getUriForFile IllegalArgumentException

送分小仙女□ 提交于 2019-12-01 10:44:59

问题


My code for sending a file with an Intent doesn't work with all file sources and I could not find the solution yet:

My app is registered for opening files, so when I select a file in ES File Explorer the intent looks like this:

intent->mData->uriString=/storage/emulated/0/backups/apps/NextGenEndPoint_1.0.apk    

when selecting the same file in Asus File Manager I get following intent:

intent->mData->uriString=/file/sdcard/backups/apps/NextGenEndPoint_1.0.apk

This is my code:

        // With this path it works. Path example being sent by e.g ES File Explorer
        String fileName = "/storage/emulated/0/backups/apps/PDFViewer.apk";
        // with this path it doesn't. This path is sent by Asus File Explorer
        fileName = "/file/sdcard/backups/apps/PDFViewer.apk";
        final Intent installIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
        installIntent.setData(getUriForFile(context, "com.myapp.fileprovider", new File(fileName)));
        installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        context.startActivity(installIntent);

I also tried new File("/file/sdcard/backups/apps/PDFViewer.apk").exists(); what returns false.

The xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external" path="/"/>      
</paths>

And the provider in the manifest:

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

The exception:

 11-02 12:21:09.004: E/ACRA(9807): com.mycompany.myapp fatal error : Failed to find configured root that contains /file/sdcard/PDFViewer.apk
 11-02 12:21:09.004: E/ACRA(9807): java.lang.IllegalArgumentException: Failed to find configured root that contains /file/sdcard/PDFViewer.apk
 11-02 12:21:09.004: E/ACRA(9807):  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(SourceFile:711)
 11-02 12:21:09.004: E/ACRA(9807):  at android.support.v4.content.FileProvider.getUriForFile(SourceFile:400)

What am I missing?


回答1:


In the referenced File:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external" path="/"/>      
</paths>

use files-path instead of external-path

or

use Environment.getExternalStorageDirectory()




回答2:


 /file/sdcard/backups/apps/NextGenEndPoint_1.0.apk. 

No that is only a part of the content sheme you got. File Manager app from ASUS will deliver

 content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/NextGeEndPoint_1.0.apk. 

You better show your code where you determine the 'path' as now you do it wrong.




回答3:


The problem was using getUriForFile for file system paths and also for File Provider paths that actually must be used with a content resolver, so the solution was following:

            Uri uri;
            if (ContentResolver.SCHEME_CONTENT.equals(fileUri.getScheme())) {
                uri = new Uri.Builder()
                        .path(fileUri.getPath())
                        .authority(fileUri.getAuthority())
                        .scheme(ContentResolver.SCHEME_CONTENT)
                        .build();
            } else {
                uri = getUriForFile(context, "com.myapp.fileprovider", new File(fileUri.getPath()));
            }


来源:https://stackoverflow.com/questions/40386491/android-geturiforfile-illegalargumentexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!