3

res/rawアプリのディレクトリにある画像を共有インテントと共に渡そうとしています。

FileProvider docsで説明されているプロセスに従いました。これが私のコードです。

AndroidManifest.xml

<application ...>
    <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/paths" />
    </provider>
</application>

res/xml/paths.xml

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

私の活動のコード:

String shareToPackage = ...

File imageFile = new File(context.getFilesDir().getPath() + "/image");
if (!imageFile.exists()) { // image isn't in the files dir, copy from the res/raw
    final InputStream inputStream = context.getResources().openRawResource(R.raw.my_image);
    final FileOutputStream outputStream = context.openFileOutput("image", Context.MODE_PRIVATE);

    byte buf[] = new byte[1024];
    int len;
    while ((len = inputStream.read(buf)) > 0) {
        outputStream.write(buf, 0, len);
    }

    outputStream.close();
    inputStream.close();

    imageFile = new File(context.getFilesDir().getPath() + "/image");
}

if (!imageFile.exists()) {
    throw new IOException("couldn't find file");
}

final Uri uri = Uri.fromFile(imageFile);
context.grantUriPermission(shareToPackage, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_TEXT, "here's the image");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setPackage(shareToPackage);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);

他のアプリで取得したファイルにアクセスできないため、上記は機能しません。

java.io.FileNotFoundException: FILE_PATH: オープンに失敗しました: EACCES (許可が拒否されました)

ここで何が間違っているのか分かりますか?
ありがとう。

4

2 に答える 2

3

からすべてを提供しているため、ここでは必要ないため、のpath属性を削除します。<files-path>getFilesDir()

Fileオブジェクトの作成時に文字列連結を使用しないでください。交換:

new File(context.getFilesDir().getPath() + "/image.png");

と:

new File(context.getFilesDir().getPath(), "image.png");

最も重要なことは、使用しないことUri.fromFile()です。を使用しFileProvider.getUriForFile()ます。現状では、このすべての作業を行って をセットアップします。その後、コンテンツを他のアプリで利用できるようにするために をFileProvider使用しません。FileProvider

または、これをすべて取り除き、生のリソースを直接提供できるmy を使用します。StreamProvider

または、ContentProvider生のリソースを直接提供する独自のものを作成します。

于 2016-08-03T12:05:07.623 に答える