2012-12-13 29 views
13

From here私は、ファイルを書き、他のアプリケーションや他の目的にアクセスできるようになりましたが、Context.MODE_WORLD_READABLEは推奨されなくなりました。これをどうすれば安全に達成できますか?Android:廃止予定のContext.MODE_WORLD_READABLEの代替ですか?

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

オーケー詳細:

私はこの使用しています:

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

をウリが、私はSDカードの場所に書き込みますいずれかになります。そして、ビデオはアプリケーションから来るので、問題があります。これが今では許されていなければ、どのようにファイルを書き出して見ることができますか?

答えて

11

そして、uriは私がsdcardの場所に書き込むものになります。

これは既定ではすでにMODE_WORLD_WRITABLEです。また、あなたが記載したコード(openFileOutput())はではありません。外部記憶装置への書き込み(間違って「sdcard」と呼ぶもの)。 openFileOutput()は内部保存用です。

ビデオがアプリケーションから来るので、これが今では許されない場合はどうすればファイルを書き出して見ることができますか?

実際にファイルを外部ストレージに書き込む場合は、そのファイルを指し示すUriを使用してください。

ファイルを内部ストレージに書き込む場合は、そのファイルを提供するためにContentProviderを作成し、ContentProviderを指すUriを使用します。 Here is a sample applicationContentProviderとすると、最初に実行したときにassets/からPDFファイルが抽出され、openFile()でそのファイルが処理されるため、PDFビューアで表示できます。

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

グッドラック:これを行うその後

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

を:

+0

ありがとうございました。それはその場所に当たる。 :D – Marl

+1

ビデオファイルが( 'getCacheDir'で指定された場所を使用して)内部ストレージにファイルとして保存されている場合、ContentProviderが何らかの形で再生可能なVideoViewへのURIを提供できると言っていますか?内部的に保存されたビデオへの直接URIは機能しません(私は、ビデオファイルがビデオビューで再生されるためには世界的に読める必要があるため、アプリケーションのプライベート内部キャッシュであれば世界では読めないためです)。 –

+0

@DanielSmith: "ContentProviderが何らかの形でVideoViewのURIを提供していて、それを再生できると言っていますか?" - ビデオはトリッキーです。通常、再生可能なストリーム(前方と後方に移動可能) 'ContentProvider'によって発行されたものは検索可能ではありません。フォワード専用ストリームで再生できるビデオフォーマットは認識していませんが、私はその点については研究していません。 – CommonsWare

3

ドキュメントは明らかです。

この定数は、世界で読み取り可能なファイルを作成することは非常に危険、およびアプリケーションで セキュリティホールを引き起こす可能性のあるAPIレベル17

で廃止されました。強くお勧めします。代わりに、 アプリケーションは、 ContentProvider、BroadcastReceiver、およびServiceなどのより多くの相互作用のための正式なメカニズムを使用する必要があります。 は、 がバックアップおよび復元を実行するときなど、このアクセスモードがファイルに残ることを保証しません。ファイル作成モード:すべての 他のアプリケーションが作成したファイルへの読み取りアクセスを許可します。

+0

詳細については、私の質問に追加しました。 – Marl

7

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

+0

これは私を助けてくれてありがとう、一時ファイルのためにsdcardを使いたくない、これはApi 9以上であることに注意してください。そうすれば、Api 8にはmode_world_readable、9以上にはmode_world_readableを使います。 –

+0

もちろん、最良の選択はContentProviderですが、場合によってはこれが機能しません。例えば、プレイヤーはビデオファイルの同じ場所に保存されたsrtファイルにアクセスすることはできず、srtファイルに対してsetReadableを設定しても同じ名前を使用します。 – hasan83

+0

@ hasan83 FileOutputStreamをdata/data/comに書き込むと、****。***/myfolder、上記のようなファイルを読み込めないのですか? – NitZRobotKoder

関連する問題