0

このコードを使用して、指定したアプリでファイルを開きます。

File file = new File("/path/to/file.ext");
    if(file.exists())
    {
        Uri path=Uri.fromFile(file);

        Intent intent=new Intent(Intent.ACTION_VIEW, path);
       // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.setPackage("com.example.myapp");
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        String ext=file.getName().substring(file.getName().indexOf(".")+1);
        String type = mime.getMimeTypeFromExtension(ext);

        intent.setDataAndType(Uri.fromFile(file),type);


        try
        {
            startActivity(intent);
        }
        catch(ActivityNotFoundException e)
        {
            Toast.makeText(this, "No software found", Toast.LENGTH_SHORT).show();
        }

.zip ファイルでは完全に機能しますが、型にはまらないファイル拡張子では機能せず、ActivityNotFoundException がスローされます。プログラムでファイルの種類をアプリに関連付ける方法、またはアプリに特定のファイルを開くように強制する方法はありますか?

4

2 に答える 2

1

それを行う正しい方法は次のとおりです。

List<ResolveInfo> resInfo = packageManager.queryIntentActivities(intent, flags);
if(resInfo !=null && resInfo.size()>0) {
    //Display the activity list that can handle this file format
} else {
    //Handle this file by your own code or display error message
}

ファイルが、システムにインストールされているアプリケーションや独自のプログラムで処理できないことが明らかな場合は、エラー メッセージを表示するだけです。例外処理です。

アプリがファイルを開くことができることを 100% 確信している場合 - アプリを開きます。インテントを介してファイル入力を取得し、ハイジャックすることはできません。または、sysdump ツールまたは階層ビューアーを使用して、ターゲット アプリケーションが別のアクティビティを使用して、ファイル ピッカーから選択されたファイルを処理しているかどうかを確認することもできます。その場合、アクティビティがエクスポートされない可能性があるため、ファイルを送信できない場合があります。apk-tool と java-decompiler でターゲット アプリを逆コンパイルして、うまくいくかどうかを確認してください。

于 2013-04-08T13:48:41.297 に答える
0

間違えている。特定のファイル形式を処理できると主張するアプリがない場合、どのアプリにそれを強制したいですか? アプリで任意のファイル形式を処理できるようにする場合は、インテント フィルターを非常に一般的なものにして、常に一致するようにします。そうするアプリがない場合、何かを強制しようとしても、通常、正しく終了しません。

于 2013-04-08T13:40:42.040 に答える