ここでは同様の質問をすべて確認しましたが、自分の人生の中で、自分が間違っていることを理解することはできません。
さまざまなファイルを起動しようとするアプリケーションを作成しました。ファイルブラウザのようなものです。ファイルがクリックされると、関連するMIMEタイプに基づいてプログラムを起動しようとするか、「起動するアプリケーションを選択」ダイアログを表示します。
起動に使用するコードは次のとおりです。
File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position));
Intent myIntent = new Intent(Android.content.Intent.ACTION_VIEW);
String extension = Android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
String mimetype = Android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
myIntent.setDataAndType(Uri.fromFile(file),mimetype);
startActivity(myIntent);
これは失敗し、エラーが生成されます。
Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes }
たとえば、OI File Managerをインストールすると、このエラーがスローされる代わりにそれが開き、その中から同じファイルをクリックすると、適切なダイアログが起動します。
特定のファイルのMIMEタイプが失敗することに気づきましたが、.Zip
などの他のMIMEタイプは戻り値を返します。
ユーザーが選択できるダイアログを呼び出すためにMIMEタイプがnullの場合、何か不足していますか?
MIMEタイプを設定せず、.setData
のみを使用してアプリを起動する他のバリエーションを試しましたが、成功しませんでした。
私が実行したいアクションは、ユーザーがファイルをクリックすることです。それがアプリが起動するアプリケーションに関連付けられている場合、そうでない場合、ユーザーはアプリのリストを含む[使用するアクションを完了]ダイアログを取得します。
アドバイスありがとうございます。
Open Intentの皆さんのおかげで、ファイルマネージャーのコードで初めて答えを逃してしまいました。
File file = new File(filePath);
MimeTypeMap map = MimeTypeMap.getSingleton();
String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
String type = map.getMimeTypeFromExtension(ext);
if (type == null)
type = "*/*";
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.fromFile(file);
intent.setDataAndType(data, type);
startActivity(intent);
MIMEタイプ"* / *"
を使用すると、システムから判別できない場合(null
)、適切なアプリケーション選択ダイアログが起動されます。
提案されているこのスニペットコードのように、一般的なインテントを使用してファイルを開くことができます here :
private void openFile(File aFile){
try {
Intent myIntent = new Intent(Android.content.Intent.VIEW_ACTION,
new ContentURI("file://" + aFile.getAbsolutePath()));
startActivity(myIntent);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
しかし、アプリケーションは通常、ネストされた場合にファイルの拡張子をチェックし、最後に「text/plain」タイプでファイルを開こうとするのがわかります。
Intent generic = new Intent();
generic.setAction(Android.content.Intent.ACTION_VIEW);
generic.setDataAndType(Uri.fromFile(file), "text/plain");
try {
startActivity(generic);
} catch(ActivityNotFoundException e) {
...
}
完全なコードは この質問 またはこの オープンソースプロジェクト で確認できます。これがお役に立てば幸いです。