2017-11-19 41 views
0

私の望むのは、アプリケーション間でファイルを共有することです。私はファイルプロバイダを使用しようとしましたが、動作しませんでした。FileProviderを使用して内部ストレージを共有する

私のプラグアプリでまず、私は、ファイルプロバイダを設定している:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.mdl.test.plug"> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".ModuleActivity" 
     android:label="@string/title_activity_module" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

    </activity> 

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

</application> 

私filepaths.xmlを:

<paths> 
    <files-path path="/" name="allfiles" /> 
</paths 

およびコアアプリケーションでは、私がしようとしましたtest.txtを読んでください:

Uri uri = Uri.parse("content://com.mdl.test.plug.fileprovider/allfiles/test.txt"); 
    InputStream is = null; 
    StringBuilder result = new StringBuilder(); 
    try { 
     is = getApplicationContext().getContentResolver().openInputStream(uri); 
     BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     while ((line = r.readLine()) != null) { 
      result.append(line); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { if (is != null) is.close(); } catch (IOException e) { } 
    } 

しかし、それは、アクセス権のエラーを返す:

Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord 

私がしたいことは、コアは、プラグインからファイルを読み込む代わりに、プラグインのコアにファイルを送信することができます。どんな解決策ですか?コアアプリはそのUriの権利を持っていないためである

おかげ

+0

あなたはtest.txtファイルがどこにあるかを知らせていません。フルパスを教えてください。さらに、getUriForFile()を使用してURIを設定する必要があります。 – greenapps

答えて

0

But It return a permission error

。プラグインアプリで、IntentベースのIPC(startActivity()startService()sendBroadcast()など)をプラグインアプリに使用させることで、の "データ"ファセットにUriを含めると、プラグインアプリで権利を付与される必要があります。 FLAG_GRANT_READ_URI_PERMISSION

これは他のアプリがプラグインアプリからファイルを読み取ることを許可しないと難しくなります。

minSdkVersionが21以上の場合は、独自のContentProviderを作成してエクスポートし、独自の許可を得て自分自身を守ることができます。コアアプリケーションはその許可のために<uses-permission>要素を持っていて、必要なときにいつでもそのContentProviderの要求を行うことができます。カスタムのアクセス許可をandroid:protectionLevelsignatureとすると、通信は安全であるはずですが、コアアプリケーションとプラグインアプリに同じ署名鍵で署名する必要があります。ただし、minSdkVersionが21未満の場合、カスタムアクセス許可にはセキュリティ上の問題があります。

関連する問題