我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?
PathUtil方法只能在oreo下面工作,如果是oreo,它很可能崩溃,因为在oreo中,我们不会获得id,而是在data.getdata()中获得整个路径,所以你所需要做的就是从uri创建一个文件,从getPath()获得它的路径,然后拆分它。下面是工作代码:-
Uri uri = data.getData();
File file = new File(uri.getPath());//create path from uri
final String[] split = file.getPath().split(":");//split the path.
filePath = split[1];//assign it to a string(your choice).
上面的代码将工作在奥利奥,如果它是低于奥利奥比PathUtil将工作。谢谢!
String filePath=PathUtil.getPath(context,yourURI);
pathutil.java
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import java.net.URISyntaxException;
/**
* Created by Aki on 1/7/2017.
*/
public class PathUtil {
/*
* Gets the file path of the given Uri.
*/
@SuppressLint("NewApi")
public static String getPath(Context context, Uri uri) throws URISyntaxException {
final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19;
String selection = null;
String[] selectionArgs = null;
// Uri is different in versions after KITKAT (Android 4.4), we need to
// deal with different Uris.
if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
return Environment.getExternalStorageDirectory() + "/" + split[1];
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
uri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("image".equals(type)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
selection = "_id=?";
selectionArgs = new String[]{ split[1] };
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
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());
}
}
问题内容: 有没有一种简单的方法可以打印的完整路径? 的 应该打印 问题答案: 使用 readlink :
问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 使用jQuery输入文件的完整路径 我有以下html元素 如果我用 我只是文件名,而不是文件的完整绝对路径。有人可以告诉我如何获得完整路径吗? 问题答案: 您不能这样做-由于安全问题,浏览器将不允许这样做。尽管有解决方法,但事实是您不应该依靠这种方法。以下堆栈溢出问题与此处相关: 使用jquery输入文件的完整路径 如何从Fir
问题内容: 有没有办法从完整路径中获取最后一个值(基于’'符号)? 例: 在这种情况下,我只想了解JavaScript的完整路径。 问题答案: 这将处理路径中的\ OR /
问题内容: 例如,我如何获得 从 用PHP? 问题答案: 您正在寻找。 PHP手册中的示例:
问题内容: 我想获取当前文件的目录路径。我试过了: 但是,如何检索目录的路径? 例如: 问题答案: Python 3 对于正在运行的脚本的目录: 对于当前工作目录: 对于正在运行的脚本的目录: 如果你的意思是当前工作目录: 请注意,前后分别是两个下划线,而不仅仅是一个。 另请注意,如果你正在交互运行或已从文件以外的内容(例如数据库或在线资源)中加载了代码,则可能不会设置,因为没有“当前文件”的概念
我使用意图action_get_content调用startActivityForResult。有些应用程序返回给我的数据包含以下URI: 内容://media/external/images/media/18122 不知道是图像还是视频或者一些自定义内容。如何使用ContentResolver从这个URI获取实际的文件名或内容标题?