如何从给定的uri获得真正的路径在android filechooser dropbox和谷歌驱动器?
问题描述:
我想在android中实现文件选择器。我已经实现了下面的代码来打开文件选择器。如何从给定的uri获得真正的路径在android filechooser dropbox和谷歌驱动器?
public static void showFileChooser(Activity activity, Fragment fragment) {
try {
File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "example");
if (!imageStorageDir.exists()) {
imageStorageDir.mkdirs();
}
File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
mCapturedImageURI = Uri.fromFile(file); // save to the private variable
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
captureIntent.putExtra("capturedimageuri", mCapturedImageURI.toString());
// Intent for Audio Recording
final Intent audioRecordIntent = new Intent();
audioRecordIntent.setAction(IAdoddleConstants.ACTION_AUDIO_RECORD);
final Intent videoRecordIntent = new Intent();
videoRecordIntent.setAction(IAdoddleConstants.ACTION_VIDEO_RECORD);
// Use the GET_CONTENT intent from the utility class
Intent target = com.asite.adoddle.filechooser.FileUtils.createGetContentIntent();
// Create the chooser Intent
if (activity != null) {
Intent intent = Intent.createChooser(
target, activity.getString(R.string.chooser_title));
intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { captureIntent,audioRecordIntent, videoRecordIntent});
activity.startActivityForResult(intent, IMAGE_ANNOTATION_REQUEST_CODE);
} else {
Intent intent = Intent.createChooser(
target, fragment.getString(R.string.chooser_title));
intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { captureIntent,audioRecordIntent, videoRecordIntent});
fragment.startActivityForResult(intent, IMAGE_ANNOTATION_REQUEST_CODE);
}
} catch (ActivityNotFoundException e) {
AdoddleLog.e(DEBUG_TAG, "Error:" + e);
} catch (Exception ex) {
ex.printStackTrace();
CommonUtilities.showToast(activity, activity.getString(R.string.error_message), Toast.LENGTH_LONG);
}
}
现在,它打开filechooser如下所示。
现在,当我点击那个“文档”我从那里我可以选择相同的文件像下面不同的应用程序。
在这里你可以看到像谷歌驱动器和Dropbox的应用。现在我想从这个应用程序中选择文件。 现在,当我从保管箱中选择文件,然后在onActivityResult(int requestCode, int resultCode, Intent data)
我得到内容://com.dropbox.android.FileCache/filecache/2642b6eb-f9da-4775-b6c5-6cb4d6884018 uri从意图。现在如何从这个uri获得真正的路径? 我想在我的活动中附加此文件。此外,我无法获得谷歌驱动器文件的真实路径。
答
要获得的图像或视频真实路径使用:
protected String getPhotoUriRealPath(Uri contentURI) {
String path = "";
if (contentURI == null) {
return path;
}
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
path = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
path = cursor.getString(idx);
}
if (cursor != null) {
cursor.close();
}
return path;
}
protected String getVideoUriRealPath(Uri contentURI) {
String path = "";
if (contentURI == null) {
return path;
}
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
path = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
path = cursor.getString(idx);
}
if (cursor != null) {
cursor.close();
}
return path;
}
不使用文件路径,用'InputStream'代替 - 见'更多信息 – pskink
@pskink ContentResolver'文档,所以你使用的InputStream我的意思将该文件写在我的SD卡上,然后使用该SD卡的文件路径。 –
为什么你需要文件路径?你不能只使用'InputStream'吗? (或'ParcelFileDescriptor' /'FileDescriptor')? – pskink