3

内部ストレージにファイルを保存しています。これは、オブジェクトに関するいくつかの情報を含む単なる .txt ファイルです。

    FileOutputStream outputStream;
    String filename = "file.txt";

    File cacheDir = context.getCacheDir();
    File outFile = new File(cacheDir, filename);
    outputStream = new FileOutputStream(outFile.getAbsolutePath());
    outputStream.write(myString.getBytes());
    outputStream.flush();
    outputStream.close();

次に、このファイルを共有するために「shareIntent」を作成しています。

    Uri notificationUri = Uri.parse("content://com.package.example/file.txt");
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, notificationUri);
    shareIntent.setType("text/plain");
    context.startActivity(Intent.createChooser(shareIntent, context.getResources().getText(R.string.chooser)));

選択したアプリはプライベート ファイルにアクセスする必要があるため、コンテンツ プロバイダーを作成しました。openFile メソッドを変更しました:

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    File privateFile = new File(getContext().getCacheDir(), uri.getPath());
    return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY);
}

マニフェスト:

<provider
        android:name=".ShareContentProvider"
        android:authorities="com.package.example"
        android:grantUriPermissions="true"
        android:exported="true">
    </provider>

ファイルを共有するためにメール アプリを開くと、0 バイトしかないため、ファイルを添付できませんでした。Bluetooth 経由での共有も失敗しました。しかし、コンテンツ プロバイダーで を読み取ることができるprivateFileので、存在し、コンテンツがあります。何が問題ですか?

4

1 に答える 1

6

pskinkさん、ありがとうございます。FileProvider は完璧に機能しました:

Gradle の依存関係:

compile 'com.android.support:support-v4:25.0.0'

マニフェスト:

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

XML フォルダー内の file_paths.xml:

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

共有の意図:

    File file = new File(context.getCacheDir(), filename);

    Uri contentUri = FileProvider.getUriForFile(context, "com.package.example", file);

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
    shareIntent.setType("text/plain");
    context.startActivity(Intent.createChooser(shareIntent, context.getResources().getText(R.string.chooser)));
于 2016-11-20T11:57:03.810 に答える