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 文件,但不适用于非常规的文件扩展名,它会抛出 AcivityNotFoundException。有没有办法以编程方式将文件类型关联到应用程序,或强制应用程序打开给定文件?

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

你理解错了。如果没有应用程序声称能够处理给定的文件格式,那么您想强制执行哪个应用程序?如果您想让您的应用程序处理任何文件格式,请使您的 Intent 过滤器非常通用,以使其始终匹配。如果没有应用程序这样做,尝试强制执行任何操作通常都不会正确结束。

于 2013-04-08T13:40:42.040 回答