2017-11-19 6 views
0

Ich möchte Dateien zwischen meinen Anwendungen freigeben. Ich habe versucht, den Dateianbieter zu verwenden, aber es hat nicht funktioniert.Freigabe des internen Speichers mit FileProvider

First In meiner Stecker app, ich habe eine Datei Provider eingerichtet:

<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> 

mein filepaths.xml:

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

Und In einer Core-Anwendung, habe ich versucht zu lese 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) { } 
    } 

aber es gibt einen Berechtigungsfehler:

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

Was ich will, ist Core-Dateien von Steckern statt Plug-Dateien senden Core lesen kann. Irgendeine Lösungsmöglichkeit?

Dank

+0

Sie haben nicht angegeben, wo sich Ihre test.txt-Datei befindet. Bitte sagen Sie den vollständigen Pfad. Weiter sollten Sie getUriForFile() verwenden, um das URI einzurichten. – greenapps

Antwort

0

But It return a permission error

Das liegt daran, dass der Kern App zu diesen Uri keine Rechte hat. Sie müßten Rechte vom Plug-App gewährt, durch den Plug-App einig Intent -basierte IPC (startActivity(), startService(), sendBroadcast(), etc.) verwenden zu müssen, wo Sie die Uri in den „Daten“ Facette der Intent und Verwendung schließen FLAG_GRANT_READ_URI_PERMISSION.

Das ist schwer zu machen, ohne auch anderen Apps das Lesen von Dateien aus der Plugin-App zu erlauben. Wenn Ihre minSdkVersion 21 oder höher ist, können Sie Ihre eigene ContentProvider erstellen, die exportiert wird und sich mit einer benutzerdefinierten Berechtigung verteidigt. Die Kern-App würde ein <uses-permission> Element für diese Berechtigung haben, und dann könnte es Anfragen von diesem ContentProvider wann immer es will. Wenn Sie der benutzerdefinierten Berechtigung eine android:protectionLevelsignature geben, sollte Ihre Kommunikation sicher sein, obwohl die Core-App und die Plugin-App mit demselben Signaturschlüssel signiert werden müssten. Wenn Ihr minSdkVersion jedoch unter 21 ist, haben benutzerdefinierte Berechtigungen einige Sicherheitsprobleme.

Verwandte Themen