web-dev-qa-db-ja.com

Android:非推奨のContext.MODE_WORLD_READABLEの代替?

ここから ファイルを書き込んで他のアプリや他のインテントにアクセスする方法を知っていますが、Context.MODE_WORLD_READABLEが非推奨になったので、これを安全に実行するにはどうすればよいですか?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE);

わかりました詳細:

私はこれを使用しています:

intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");

そして、URIは私がSDカードの場所に書き込むものになります。そして、ビデオはアプリケーションから来るので、問題は、これが現在許可されていない場合、どうすればファイルを書き込んで表示できるかということです。

15
Marl

そして、URIは私がSDカードの場所に書き込むものになります。

これは、デフォルトではすでに_MODE_WORLD_WRITABLE_です。また、リストしたコード(openFileOutput())はnot外部ストレージ(誤って「sdcard」と呼んでいるもの)に書き込みません。 。 openFileOutput()は内部ストレージ用です。

そして、ビデオはアプリケーションから来るので、問題は、これが現在許可されていない場合、どうすればファイルを書き込んで表示できるかということです。

実際にファイルを外部ストレージに書き込んでいる場合は、そのファイルを指すUriを使用するだけです。

ファイルを内部ストレージに書き込む場合は、そのファイルを提供するためにContentProviderを作成し、そのUriを指すContentProviderを使用します。 これはサンプルアプリケーションです 最初の実行時に_assets/_からPDFファイルを抽出し、次にそのファイルを提供するContentProviderを使用openFile()なので、PDFビューアで表示できます。

11
CommonsWare

以下を使用して、ビデオを内部メモリに保存します。

openFileOutput("test.mp4", "MODE_PRIVATE");

次に、これを行います。

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory.
File f = new File(path);
f.setReadable(true, false);
Intent playIntent ....
playIntent.setType("video/*");
playIntent.setData(Uri.fromFile(f));

幸運を。

8
hasan

ドキュメントはそれについて明確に見えるようです。

この定数は、APIレベル17で非推奨になりました。

世界的に読み取り可能なファイルを作成することは非常に危険であり、アプリケーションにセキュリティホールを引き起こす可能性があります。強くお勧めしません。代わりに、アプリケーションは、ContentProvider、BroadcastReceiver、Serviceなどの対話に、より正式なメカニズムを使用する必要があります。バックアップと復元を実行する場合など、このアクセスモードがファイルに残るという保証はありません。ファイル作成モード:他のすべてのアプリケーションに、作成されたファイルへの読み取りアクセスを許可します。

3
Andro Selva