20

ここで同様の質問をすべて確認しましたが、何が間違っているのか一生わかりません。

ファイルブラウザのような、さまざまなファイルを起動しようとするアプリケーションを作成しました。ファイルがクリックされると、関連する 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 タイプが失敗することに気付きましたが、他の MIME タイプ.zipは値を返します。

MIME タイプが null の場合に、ユーザーが選択できるダイアログを呼び出す何かが欠けていますか?

.setDataMIMEタイプを設定せず、成功しないだけで使用するなど、アプリを起動する他のバリエーションを試しました。

私がやりたいアクションは、アプリが起動するアプリケーションに関連付けられている場合、ユーザーがファイルをクリックすることです。そうでない場合、ユーザーはアプリのリストを含む「Complete action using」ダイアログを取得します。

アドバイスをありがとう。

4

2 に答える 2

48

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

于 2012-06-18T18:39:36.827 に答える
1

ここで提案されているこのスニペットコードのように、汎用インテントを使用してファイルを開くことができます。

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) {
    ...
}     

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

于 2012-06-17T05:25:06.870 に答える