1

ファイルを内部ストレージに保存しています。これは、オブジェクトに関するいくつかの情報を持つだけで.txtファイルです:コンテンツプロバイダの内部ストレージからのAndroid Intent.ACTION_SEND

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

選ばれたアプリは現在、民間のファイルにアクセスする必要があります私はコンテンツプロバイダを作成しました。

@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); 
} 

マニフェスト:私はちょうどのOpenFileメソッドを変更し

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

それが唯一の0バイトを持っているので、それはファイルを添付できないこと、それが言うファイルを共有するためにメールアプリケーションを開きます。 Bluetooth経由で共有することもできませんでした。しかし、私はコンテンツプロバイダーのprivateFileを読むことができるので、それは存在し、内容を持っています。何が問題ですか?

+0

はあなたのカスタムContentProviderで 'query()'メソッドが呼び出されていますか? – pskink

+0

はい、openFileの前に3回呼び出されます。最初の引数は常に:content://com.package.example/file.txt – L3n95

+2

で、投影/列は_display_nameと_sizeですか? BTWなぜ 'android.support.v4.content.FileProvider'を使用しないのですか? – pskink

答えて

4

ありがとうpskink。 FileProviderは完全に働いた:

Gradleの依存関係を:

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

マニフェスト:XMLフォルダ内の

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

file_paths.xml:

0123:

<?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))); 
+0

また、これをインテントに追加する必要があります。 shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); –

関連する問題