Convert a file path to Uri in Android

I have an app where I capture a video using the camera. I can get the video's file path, but I need it as a Uri.

The file path I'm getting:

/storage/emulated/0/DCIM/Camera/20141219_133139.mp4

What I need is like this:

content//media/external/video/media/18576.

This is my code.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if the result is capturing Image


if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// video successfully recorded
// preview the recorded video
// selectedImageUri = data.getData();
// Uri selectedImage = data.getData();
previewVideo();


tv1.setText(String.valueOf((fileUri.getPath())));
String bedroom=String.valueOf((fileUri.getPath()));
Intent i = new Intent();
i.putExtra(bhk1.BEDROOM2, bedroom);
setResult(RESULT_OK,i);
btnRecordVideo.setText("ReTake Video");


} else if (resultCode == RESULT_CANCELED) {
// user cancelled recording
Toast.makeText(getApplicationContext(),
"User cancelled video recording", Toast.LENGTH_SHORT)
.show();
} else {
// failed to record video
Toast.makeText(getApplicationContext(),
"Sorry! Failed to record video", Toast.LENGTH_SHORT)
.show();
}
}
}

I need a Uri from the String variable bedroom.

194055 次浏览

请尝试以下代码

Uri.fromFile(new File("/sdcard/sample.jpg"))

下面的代码在18 API 之前可以正常工作:-

public String getRealPathFromURI(Uri contentUri) {


// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( contentUri,
proj, // Which columns to return
null,       // WHERE clause; which rows to return (all rows)
null,       // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();


return cursor.getString(column_index);
}

在 kitkat 上使用以下代码:-

public static String getPath(final Context context, final Uri uri) {


final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;


// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];


if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}


// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {


final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));


return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];


Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}


final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};


return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}


return null;
}


/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {


Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};


try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}




/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}


/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}


/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}

更多信息见下面的链接:-

Https://github.com/ipaulpro/afilechooser/blob/master/afilechooser/src/com/ipaulpro/afilechooser/utils/fileutils.java

如果你真的想得到类似于 content//media/external/video/media/18576的东西(例如你的视频 mp4绝对路径)而不仅仅是 file///storage/emulated/0/DCIM/Camera/20141219_133139.mp4,这个问题的正常答案是:

MediaScannerConnection.scanFile(this,
new String[] { file.getAbsolutePath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("onScanCompleted", uri.getPath());
}
});

接受的答案是错误的(因为它不会返回 content//media/external/video/media/*)

Uri.fromFile(file).toString()只返回类似于 file///storage/emulated/0/*的内容,file///storage/emulated/0/*是 sdcard 上文件的简单绝对路径,但带有 file//前缀(schema)

You can also get content uri using MediaStore database of Android

TEST (what returns Uri.fromFile and what returns MediaScannerConnection):

File videoFile = new File("/storage/emulated/0/video.mp4");


Log.i(TAG, Uri.fromFile(videoFile).toString());


MediaScannerConnection.scanFile(this, new String[] { videoFile.getAbsolutePath() }, null,
(path, uri) -> Log.i(TAG, uri.toString()));

产出:

I/Test: file:///storage/emulated/0/video.mp4

I/Test: content://media/external/video/media/268927

If you want to Get Uri path from String File path .this code will be worked also in androidQ.

String outputFile = context.getExternalFilesDir("DirName") + "/fileName.extension";


File file = new File(outputFile);
Log.e("OutPutFile",outputFile);
Uri uri = FileProvider.getUriForFile(Activity.this,
BuildConfig.APPLICATION_ID + ".provider",file);

应用程序中的声明提供程序

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>

在 res-> xml-> Provider _ path. xml 下

<paths>
<external-path name="external_files" path="."/>
</paths>