2017-03-14 5 views
0

です。私のAndoroidアプリでは、ユーザが自分の好む送信方法(電子メール、Skype、Viberなど)を使用して、ブルートゥース、など) 次のように私はIntent.ACTION_SEND使用しています:FileProvider.getUriForFileとUri.fromFileとの違いはありますが、アクセス許可は

に成功期待と同じように、Gmailの、とBluetooth経由でファイルを送信し
File readF = new File(fullFileName); 
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/plain"); 
intent.putExtra(Intent.EXTRA_SUBJECT, getResources().getString(R.string.some_subject)); 
intent.putExtra(Intent.EXTRA_TEXT, getResources().getString(R.string.some_message_body)); 
Uri uri = FileProvider.getUriForFile(this, "my.package.fileprovider", readF); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 
startActivity(Intent.createChooser(intent, getResources().getString(R.string.some_info_message)); 

を。ユーザーがViberの何も送信されません選択した場合

しかし、ユーザーがSkypeのを選択したとき、ファイルが送信されますが、その名前が

を変更しました。私はウリを構築する唯一の方法を変更した場合は

Uri uri = Uri.fromFile(new File("/some/publicly/available/file")); 

次に、ファイルが正常にスカイプを介して両方送信され、Viberの、名前が保存されています。

したがって、FileProviderとIntentのパブリックファイルを直接使用する場合の違いは何ですか?

答えて

1

次のように私はIntent.ACTION_SEND使用しています:

私はあなたがそのIntentIntent.FLAG_GRANT_READ_URI_PERMISSIONを追加することをお勧めします。

ファイルがSkypeとViberの両方で正常に送信され、名前が保持されます。

targetSdkVersionが24以上に登るまで、あなたはAndroid 7.0以降でアプリを起動します。その後、あなたのアプリはFileUriExposedExceptionでクラッシュします。

ファイルがSkypeとViberの両方で正常に送信され、名前が保持されます。

今のところおそらく、これらのアプリの作者などは、あなたのファイル名を維持する義務はありません。彼らはあなたのものではなく、自分たちのアプリであるので、彼らが望むものを何でもすることができます。

したがって、FileProviderとIntentのパブリックファイルを直接使用する場合の違いは何ですか?

FileProviderは、Webサーバーとほぼ同じです。これにより、アプリは基本的なファイルに直接アクセスする必要はなく、他のアプリにコンテンツを共有することができます。 Googleは、外付けストレージを持っていることから、ACTION_SENDのようなものをサポートするための無駄なゴミ投棄地となることを避けようとしているため、Android 7.0以降では、StrictModeは、 fileUri(例えば、Uri.fromFile())。

+0

ありがとうございます!安全な側にIntent.FLAG_GRANT_READ_URI_PERMISSIONを追加しました。私はFileProviderが正しい方法であると理解しています。SkypeとViberは自分のファイルで何でもできることを理解していますが、気になるものは、ファイルを送信している間は、パーミッション。そして行動の違いは私が完全に理解していないことです。 – Jeni

+1

@Jeni:「私はそれが彼らにとって透明であるべきだと思った」 - 理想的には、そうである。 'FileProvider'は' content' 'Uri'の"ファイル名 "部分としてファイル名を使用し、' ContentResolver'の 'openInputStream()'は 'file'と' content'の両方を扱うので、理想的にSkypeとViberは両方平等に「ウリ」の形態をとる。明らかに、彼らはしません。これらの企業に就職し、その中からコードを修正しようとする以外に、これについて本当にできることは何もありません。 – CommonsWare

関連する問題