2012-06-17 11 views
20

私はここですべての同様の質問を見直しましたが、私の人生は私が間違っていることを理解することはできません。ファイルと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ファイルマネージャをインストールした場合さて、それはこの代わりに開きますエラーがスローされ、その中から同じファイルをクリックすると、適切なダイアログが表示されます。

私は特定のファイルのMIMEタイプが失敗したことに気付きましたが、.zipのような他のMIMEタイプは値を返します。

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

私は、MIMEタイプを設定せず、.setDataのみを使用するなど、アプリを起動するさまざまな方法を試しました。

私は、ユーザーがファイルをクリックすると、アプリケーションが起動するアプリケーションに関連付けられている場合、それ以外の場合は、アプリケーションのリストを使用して「完了アクションを使用する」ダイアログが表示されます。

ありがとうございました。

+0

何が来ていますか?それをここに貼り付けてください –

+0

それは関連するファイルを持っているかのように見えますが、それは正しいMIMEタイプですが、それがアプリに結び付けられていないものであればnullになります.. – stonedonkey

答えて

44

まあおかげで、私はここに私がなってしまったものだ、彼らのファイルマネージャでそのコードを解答を初めて逃しましたそれをシステムから特定することはできません(null)、それは適切な選択アプリケーションダイアログを起動します。

+7

警告! - jpgの場合、MIMEタイプはjpegであり、jpgではありません。あなたのコードを使用して、jpg拡張子を抽出すると、MIMEタイプが正しく設定されず、その結果、画像を見ることができなくなります。 jpgイメージのMIMEタイプを設定するときは、jpgをjpegに置き換えてください。 – AndroidDev

+0

私の助けてくれてありがとうが、実際のファイルはintent.setDataAndType(data、type)を設定してから選択しないでください。ファイルのアップロードに失敗しました。 –

+1

また、MimeTypeMap.getFileExtensionFromUrlでは、アポストロフィもうまく処理できません。「World'sHello.docx」の空の文字列が返されますが、「WorldzHello.docx」のdocxが返されます。 Regexはこちらをご覧ください:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

あなたは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) { 
    ... 
}  

あなたはthis questionまたはこのopen source projectに完全なコードを見ることができます。これがあなたを助けることを願っています

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タイプを使用する場合:オープン・インテントの男に

+0

私はこれらを試しても、私が探している結果最初の例は同じ例外を生成します。 text/plainをMIMEタイプとして理解しているアプリケーションだけを起動しようとするので、どちらも動作しません。 ありがとうございます。 – stonedonkey