失败的打开内容提供程序(FileProvider)

问题描述 投票:0回答:1

我正在尝试通过FileProvider API共享文件。在服务器端,文件已配置如下:

public void prepareData() {
    File apkFile = new File(context.getCacheDir(), "ngp-187002.apk");


    Uri apkFileUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", apkFile);
    Log.i(TAG, "Apk file Uri: " + apkFileUri.toString() + ", fileSize = " + apkFile.length());

    context.grantUriPermission(NGP_UPDATER_PACKAGE_NAME, apkFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

    Intent updaterIntent = new Intent();

    updaterIntent.setClassName(NGP_UPDATER_PACKAGE_NAME, NGP_UPDATER_SERVICE_CLASS_NAME);
    updaterIntent.setAction(EXTERNAL_ACTION_UPDATE_NGP);
    // updaterIntent.putExtra(EXTERNAL_PARAM_APK_LOC, TARGET_APK_DIR);
    updaterIntent.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
    updaterIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    // Since NgpApp & NgpUpdater are signed by the same key, we can start the process
    context.startService(updaterIntent);
}

[AndroidManifest.xml已配置如下:

<provider
  android:authorities="${applicationId}.fileprovider"
  android:exported="false"
  android:grantUriPermissions="true"
  android:name="android.support.v4.content.FileProvider">
  <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/fileproviderpath"/>
</provider>

Filepath xml文件如下

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache" path="."/>
</paths>

接收方是一个IntentService,我正在尝试获取如下所示的流:

String apkLocUri = intent.getData();
is = getBaseContext().getContentResolver().openInputStream(apkLocUri);

但是我得到

java.io.FileNotFoundException: Failed opening content provider: content://com.canaldigital.ngp.fileprovider/cache/ngp-187002.apk
    at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1187)
    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:984)
    at android.content.ContentResolver.openInputStream(ContentResolver.java:704)
    at com.canaldigital.ngpupdater.PackageInstallerService.installPackage(PackageInstallerService.java:60)
    at com.canaldigital.ngpupdater.PackageInstallerService.onHandleIntent(PackageInstallerService.java:52)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.os.HandlerThread.run(HandlerThread.java:61)
android android-fileprovider
1个回答
0
投票

上次与内容提供商合作时,我以这种方式创建了权限:通过在AndroidManifest,xml文件中添加以下代码来创建读写权限:

    <uses-permission android:name="com.anystring.READ_PERMISSION"/>
    <uses-permission android:name="com.anystring.WRITE_PERMISSION"/>

    <permission android:name="com.anystring.READ_PERMISSION"
        android:protectionLevel="signature" />
    <permission android:name="com.anystring.WRITE_PERMISSION"
        android:protectionLevel="signature" />
<application
// ... rest of the code ...
/>

在提供者中,接下来,您需要在提供者代码中授予这些权限,所以看起来像这样:

<provider
  android:authorities="${applicationId}.fileprovider"
  android:readPermission="com.anystring.READ_PERMISSION"
  android:writePermission="com.anystring.WRITE_PERMISSION"
  android:enabled="true"
  android:exported="true"
  android:multiprocess="true"
  android:grantUriPermissions="true"
  android:name="android.support.v4.content.FileProvider">
  <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/fileproviderpath"/>
</provider>

基本上,这样,您就可以创建权限。只有清单文件中被授予权限的应用程序才能访问数据。签名级别保护可确保只有您公司的应用程序可以读取彼此的数据。因此,根据您的需要进行更改/删除。我希望这能奏效,祝您好运。

© www.soinside.com 2019 - 2024. All rights reserved.