web-dev-qa-db-ja.com

ファイルとMIMEタイプのインテントを起動しますか?

ここでは同様の質問をすべて確認しましたが、自分の人生の中で、自分が間違っていることを理解することはできません。

さまざまなファイルを起動しようとするアプリケーションを作成しました。ファイルブラウザのようなものです。ファイルがクリックされると、関連する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のみを使用してアプリを起動する他のバリエーションを試しましたが、成功しませんでした。

私が実行したいアクションは、ユーザーがファイルをクリックすることです。それがアプリが起動するアプリケーションに関連付けられている場合、そうでない場合、ユーザーはアプリのリストを含む[使用するアクションを完了]ダイアログを取得します。

アドバイスありがとうございます。

20
stonedonkey

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)、適切なアプリケーション選択ダイアログが起動されます。

46
stonedonkey

提案されているこのスニペットコードのように、一般的なインテントを使用してファイルを開くことができます 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) {
    ...
}     

完全なコードは この質問 またはこの オープンソースプロジェクト で確認できます。これがお役に立てば幸いです。

1
hasanghaforian