作者codemonkey (程式猿)
看板AndroidDev
标题[问题] 从content:// URI资源反查档案位置
时间Sun Feb 24 01:28:00 2013
我要让使用者选择档案,方法是用Intent + ACTION_GET_CONTENT (chooser)
选择档案後回传的资源可分为 content:/和 file:// URI
如果是file:// 格式,就把路径抓出来即可,因为其实就是指向sdcard下的档案
问题出在反查content:/ URI的时候,会得到奇怪的路径:
1. 得到content URI:content://media/xxxx/<资源编号>
2. 反查该资源对应的路径:/storage/sdcard0/Pictures/<档案名称>
3. 用File物件开启档案 ... 就挂了
请问 storage/sdcard0/Pictures/ 其实是装置名称而不是挂载目录名称吗,
有别的方法可以拿到目录名称吗,或是这样的结果是正确的?
---------------------------
content URI 反查路径程式片段
ContentResolver res = getContentResolver();
Cursor c=res.query(uri, new String[]{"_data"}, null, null,null);
int index = c.getColumnIndexOrThrow("_data");
c.moveToFirst();
path=c.getString(index);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.161.32.68
1F:→ qweqweqweqwe:我猜你1. 拿到的是 该笔资料在mediaprovider的 id 02/24 02:37
2F:→ qweqweqweqwe:也就是你的 "<资源编号>" 用这id去query 02/24 02:37
3F:→ qweqweqweqwe:mediaprovider 的 _data 栏位 的确会拿到档案在 02/24 02:37
4F:→ qweqweqweqwe:本机上的位置 就我所知 应该所有media要去执行 02/24 02:38
5F:→ qweqweqweqwe:档案(ex. mp3/video) 都是用这个栏位居多 02/24 02:39
6F:→ qweqweqweqwe:所以在 mediaScanner运行正常下 _data 这个栏位 02/24 02:40
7F:→ qweqweqweqwe:应该就是你要的档案位置没错 02/24 02:41
应该说档案实际位置是 /sdcard/Pictures/<档案>
但是用URI查询出来是 /storage/sdcard0/Pictures/<档案>
导致File object找不到档案
8F:→ pico2k:权限? 02/24 10:58
有可能,虽然反查路径成功,但是无法读取...
不过这个路径在DDMS看不到耶
虽然暂时可以自己硬改为正确的路径啦
不过这可能不是正规做法
※ 编辑: codemonkey 来自: 118.161.32.68 (02/24 13:35)
9F:→ qweqweqweqwe:但MediaScanner应该有handle权限的问题 02/24 14:57
10F:→ qweqweqweqwe:所以MediaProvider里面应该只会放Current User可以 02/24 14:58
11F:→ qweqweqweqwe:读取的档案才对 02/24 14:58
12F:→ qweqweqweqwe:mnt/sdcard/ 会挂载到 /storage/sdcard + USERID 02/24 14:59
13F:→ qweqweqweqwe:记得是这样 不过在DDMS里面可以看到它是如何link 02/24 14:59
14F:→ qweqweqweqwe:就是了 有错还请指正 02/24 15:01
15F:→ qweqweqweqwe:对了我记得有特定的资料夹可以让 user共享档案的样子 02/24 15:02
16F:→ qweqweqweqwe:倒不如把你要执行的档案放到那个资料夹 02/24 15:03
17F:→ qweqweqweqwe:或许可以验证是不是 权限 的问题 02/24 15:03