我可以使用一些帮助来了解如何在 android 中打开文件。我的具体问题与打开图像文件有关。在我的应用程序中,用户使用他们选择的相机应用程序拍摄图像,然后我对返回的图像进行操作。根据手机、Android 版本和所选相机应用程序的不同,我会在 onActivityResult 中返回不同的参数。有时我会得到一个 URI,有时只是一个图像,有时两者兼而有之。
启动相机的代码是:
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, CAMERA_IMAGE);
然后我收到的结果为:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) {
Log.d(TAG,"In onActivityResult");
Bitmap imageBmp = null;
Uri imageUri = data.getData();
if (data.getExtras() != null) {
imageBmp = (Bitmap)data.getExtras().get("data");
Log.d(TAG,"Got Bitmap");
}
...
}
}
当我得到 URI 但没有图像时,我的问题就出现了。如果 imageBmp 为 null,那么我需要从 URI 加载图像。我已经测试了几种设备/应用程序组合。有时 URI 位于内部存储器上,有时位于 SD 卡上。如果文件位于 SD 卡上,那么我已使用 ManagedQuery 来获取该文件。
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(imageUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageFileName = cursor.getString(column_index);
File imageFile = new File(imageFileName);
...
如果它位于内部存储上,那么我会收到 FileNotFoundException。
我的具体问题是:如何修改它以打开一个独立于文件系统上位置的文件,只知道 URI?我想做这样的事情:
File imageFile = new File(imageUri);
但 File 不接受 Uri 对象。我执行托管查询将其转换为字符串。
我更普遍的问题是为什么我需要首先进行查询?为什么我不能只使用返回的 URI?