web-dev-qa-db-ja.com

Androidインテント経由でファイルを開く方法

以前に「プライベート」ファイルシステムに保存されているファイルを開くにはどうすればよいですか?ファイルはWebサービスによってダウンロードされており、ローカルファイルに保存する必要があります。インテント(Action_View)を介してファイルを開こうとすると、「奇妙な」エラーが発生しました。ファイルはファイルシステムに存在しますが(エミュレーター/ Eclipseのファイルエクスプローラーでファイルを表示)、起動されたギャラリーの呼び出しアクティビティには表示されません。画像の代わりに、ギャラリーにはコンテンツが含まれていない黒い画面が表示されます(アクションバーを除く)。この方法でpdf/movie/mp3ファイルを開こうとしたときにも同じことが起こります(たとえば、pdfはファイルが破損していると言っています)。

ところで、ローカルのfsに保存されているデータは有効です(破損していない)。デバッガからファイルをダウンロードし(pullメソッドを使用)、ファイルを自分のワークステーションで開くことができます...

public void onAttachment(Context context, Attachment attachment) {
    try {
        //Attachment is a structured data object that contains of a byte[], filename and mimetype (like image/jpeg)
        FileOutputStream fos = FileOutputStream fos = context.openFileOutput(attachment.getAttachmentFileName(), Context.MODE_PRIVATE);
        fos.write(attachment.getBinary());
        fos.flush();
        fos.close();
        File f = context.getFileStreamPath(attachment.getAttachmentFileName());
        Uri uri = Uri.fromFile(f);          
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri,attachment.getAttachmentMimetype());
        context.startActivity(intent);                  
    } catch (IOException e) {
        e.printStackTrace();
    }
}           
16
tim.kaufner

場所を「openFileOutput("fileName", Activity.MODE_WORLD_READABLE)」に設定すると機能します。 「Context.MODE_PRIVATE」に設定すると、他のアプリは保存されたデータを(表示用であっても)読み取ることができません

stackoverflowの他の投稿 を参照してください

2
tim.kaufner

コード内の添付ファイルのタイプは何ですか?おそらくそれは間違ったMIMEタイプを返しますか?

このコードは私にとってはうまくいきます:

File file = new File("EXAMPLE.JPG");

// Just example, you should parse file name for extension
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(".JPG");

Intent intent = new Intent();
intent.setAction(Android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mime);
startActivityForResult(intent, 10);
12
Andy

そのようなsdcardにないファイルを開くことはできません。ファイルをSDカードにコピーしてから開く必要があります。

2
Givi