我正在使用此代码打开具有指定应用的文件:
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。有没有办法以编程方式将文件类型关联到应用程序,或强制应用程序打开给定的文件?
答案 0 :(得分: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对目标应用程序进行反编译,看看你是否有运气。
答案 1 :(得分:0)
你弄错了。如果没有应用程序声称能够处理给定的文件格式,那么您想要强制执行哪些应用程序?如果您想让您的应用处理任何文件格式,请使您的Intent过滤器如此通用,以便始终匹配。如果没有应用程序这样做,试图强迫任何东西通常不会结束。