Android フォンの外部ストレージにファイルがあります (この場合はエミュレートされています)。それへのパスを知っている、および/またはそれをFile
表すオブジェクトがある場合、を使用Intent
して適切なアプリで開くにはどうすればよいですか?
私が最初に試したのは:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)));
私はそれをテストし、アプリの別の部分に移ったので、これはある時点で機能していたと確信しています. 今では常に をスローしActivityNotFoundException
ます。file.exists()
ファイルが戻ってきて、それが正しいファイルであることはわかっているため、ファイルは間違いなく存在しtrue
ますが、自発的にそれを開くアプリはありません。
この方法で開くことができるファイルの種類は .pdf だけです。Adobe Reader が選択されていますが、デバイスにインストールされている PDF リーダーはこれだけではなく、デフォルトに設定されていません。Adobe Reader は、オンラインにある PDF ファイルを開くこともできることに気付きました (これは、Chrome で PDF をダウンロードする代わりに表示されます)。これは、場所がリモートであると考えられているため、Adobe Reader のみが に一致するものとして検出されていることを示唆していIntent
ます (ただし、Chrome やその他のファイル ダウンロード アプリが代替としてリストされていないため、オンラインではありません)。
また、MIME タイプを明示的に記述しようとしました。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/msword");
startActivity(intent);
これにより、Intent
適切なアプリに一致するようになりますが、それらはすべて実際にファイルを開くことができません。これは、MIME タイプのハードコードされた文字列とMimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
、ファイル拡張子を渡す を使用してテストしました。さまざまな種類のファイルについて、適切なアプリが提案されましたが、それらはすべてファイルを開くことができませんでした。
編集:
MIME タイプを明示的に設定することはうまくいきますが、私は非常にばかげた間違いを犯しました。おそらく回答で説明する必要があります。
私が開こうとしたファイルはインターネットからのもので、DownloadManager
. その機能を使用して、ダウンロードが完了すると通知を表示します。これらの通知のいずれかをクリックすると、ファイルが完全に開きます。完了通知がクリックされIntent
たときに発生するソースコードを見つけようとしましたが、うまくいきませんでした。DownloadManager
また、ES File Explorer などのアプリは、ファイルがダウンロードされた場所に移動して問題なく開くことができます。私は何を間違っていますか?
外部ストレージ上のファイルを ACTION_VIEW できなくなっただけですか? 私のアプリは一時的にファイルを内部ストレージにダウンロードしますが、これらは問題なく開くことができます:
//This works for files on internal storage:
Uri uri = FileProvider.getUriForFile(context, AUTHORITY, file);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
また、過去に機能していたものについては、Eclipse、SDK Tools プラグイン、および Android SDK 自体を更新すると、元のソリューションが機能しなくなった可能性がありますか?