最近我正在开发一个文件共享应用程序,我创建了一个GridView,其中显示了下载的文件。从这个View,我希望能够通过intent打开默认应用程序,打开整个文件。目前我正在测试只有图像文件的应用程序。所有文件都以这种方式下载到外部公共目录:
File externalFolder = new File(Environment.getExternalStorageDirectory(), "My application");
if(!externalFolder.exists()){
externalFolder.mkdir();
}
...
File folder = new File(externalFolder, "Images");
if(!folder.exists()){
folder.mkdir();
}
...
String filename = folder.getAbsolutePath() + "/" + fileToDownload.getName() + "." + fileToDownload.getExtension();
FileOutputStream fos = new FileOutputStream(filename);
下载文件后,我使用MediaScannerConnection.scanFile进行扫描。扫描成功,图片在照片应用程序中的其他文件中可见。
下载文件后,我可以在GridView的适配器中提取缩略图,所以我肯定有一个有效的文件路径。
乐趣开始的地方:我尝试将onClickListener设置为适配器中的GridView项目,以便能够以这种方式打开照片应用中的图片:
listItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if(new File(current.getPath()).exists()){
Log.e("path", "valid");
}else{
Log.e("path", "invalid");
}
Log.e("path", Uri.parse("content://"+current.getPath()).toString());
intent.setDataAndType(Uri.parse("content://"+current.getPath()), "image/*");
getContext().startActivity(intent);
}
});
Intent创建成功,我在日志中得到以下内容:
E/path: valid
E/path: content:///storage/emulated/0/My application/Images/best_picture_ever.jpeg
我可以选择要打开的应用。当我选择应用程序时,它无法打开图像,就像它不存在一样。所有5个申请。
我在我的设备上使用Oreo进行了测试,在两个使用Nougat和Lollipop的模拟设备上进行了测试,所有这些设备的行为都相同。
我做错了什么?
答案 0 :(得分:0)
我做错了什么?
您没有创建有效的Uri
。您不能将content://
置于任意事物的前面并拥有一个有用的Uri
,而不仅仅是https://
置于任意事物之前并拥有可用的URL。
Use FileProvider
提供此文件。