2017-12-18 12 views
1

FileProviderを設定しましたが、ファイルを送信しようとしていますが、インテントを処理する外部アプリケーション(Googleドライブなど)がインテントにデータが含まれていないというエラーが発生します。私はここで何が欠けていますか?FileProvider:ファイル送信時にデータがありません

  File backupPath = new File(getContext().getFilesDir(), "backups"); 
      File backupFile = new File(backupPath, clickedBackup.getFilename()); 
      Uri contentUri = getUriForFile(getContext(), "com.test.app.fileprovider", backupFile); 

      // create new Intent 
      Intent intent = new Intent(Intent.ACTION_SEND); 
      // set flag to give temporary permission to external app to use your FileProvider 
      intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      intent.setDataAndType(
        contentUri, 
        getContext().getContentResolver().getType(contentUri)); 
      // validate that the device can open your File! 
      PackageManager pm = getActivity().getPackageManager(); 
      if (intent.resolveActivity(pm) != null) { 
       startActivity(intent); 
      } 

Logcatは、次のことを示しています

12-18 12:47:55.554 1698 2490 I ActivityManager: START u0 {act=android.intent.action.SEND dat=content://com.test.app.fileprovider/backups/20171918_121910.bak typ=application/octet-stream flg=0x3000001 cmp=com.google.android.apps.docs/.shareitem.UploadMenuActivity} from uid 10079 

コンテンツURIは、私にはよさそうだが、何らかの理由でそれが働いていません。何か案は?

ここにプロバイダのパスがあります。

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

最後に、プロバイダ宣言。

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

UPDATE:logcatもまたはここで問題

12-18 13:21:23.739 4818 6764 E DataSourceHelper: Uploading single file but neither EXTRA_STREAM nor EXTRA_TEXT is specified. 
12-18 13:21:23.790 1431 1483 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 8298496 
12-18 13:21:23.796 1431 1483 I chatty : uid=1000(system) HwBinder:1431_1 identical 1 line 
12-18 13:21:23.807 1431 1483 D gralloc_ranchu: gralloc_alloc: Creating ashmem region of size 8298496 
12-18 13:21:23.824 4818 4818 E UploadMenuActivity: No files requested to be uploaded: android.intent.action.SEND 

EDIT 2の鍵ではないかもしれない次のことを示しています

intent.putExtra(Intent.EXTRA_STREAM, contentUri); 
+0

あなたがテストしているAndroidのバージョンは何ですか? LogCatのこれらの他のアプリからの特定のスタックトレースをあなたの質問に追加することができますか(手がかりを提供するかもしれない)?ファイルが存在していますか? '.bak'ファイルは標準のMIMEタイプを持たないので、' application/octet-stream'を使ってみましたか? – CommonsWare

+0

私は実際にlogcatの出力から見るとapplication/octet-streamを使用しています:)この場合、Googleドライブアプリからのスタックトレースはどこにも表示されません。 Android 8.0と8.1を実行しているエミュレータでこれをテストしてみましょう。上記のコードでbackupFileとして定義されているファイルが存在することも確認できます。 – ardevd

+0

'application/octet-stream'に' ACTION_SEND'をサポートしている単純な*別のアプリを一緒に投げて、そのアプリを使ってこの通信のクライアント側の生活を見てみましょう。そのアプリがストリームを正常に開いてバイトを消費できる場合は、Googleドライブや他のユーザーが同じことを実行できるはずです(ただし、これは「ACTION_SEND」テストが単なるアクティビティではなく別のアプリになる重要な理由です)あなた自身のアプリ内で)。 – CommonsWare

答えて

1

の変更を訪問

intent.setType(contentUri, "application/octet-stream"); 
intent.putExtra(Intent.EXTRA_STREAM, contentUri); 

ACTION_SENDEXTRA_STREAM —ないのUriのファセットを使用していますを送信する場合は—です。 MIMEタイプを知っているので、ContentResolver経由でIPC呼び出しを使用することには意味がありません。

-2

I:追加、これはそれがうまく動作せ行方不明の型を設定しなければならないと思います。下に追加してみてください:に

intent.setDataAndType(contentUri, getContext().getContentResolver().getType(contentUri)); 

:詳細は

intent.setType("image/*|application/pdf|audio/*"); 

https://developer.android.com/training/sharing/send.html

+0

まず、問題のコードは 'setDataAndType()'を介して型を設定しています。次に、 'setType()'はパイプで区切られたMIMEタイプをサポートしていません。 – CommonsWare

+0

実際、これはintent.setDataAndType()で行われます。 – ardevd

関連する問題