[问题] 关于Uri

楼主: gn00618777 (非常念旧)   2017-06-19 23:30:57
我是抓取 nordic nrftoolbox 的 source code。
https://goo.gl/5WxUPB
任务是利用这 code 抓取 bin file 来做 firmware 更新,客户嫌麻烦说还要loader
去选择档案,想要写死路径。
dfuActivity 主要是在 663 行
final Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
最后在 433 行回传,可以看到里面大部分就只是利用 loader 选取的 data来获取 uri
分析uri对以下填值
mFileType = mFileTypeTmp;
mFilePath = null;
mFileStreamUri = null;
接着我会经过 452 行的 else if,最后准备要更新时要执行的地方是 743行
里面的参数就是这些变量。
我用官方没改的 code ,在449行用
Log.d("",""+uri.toString);印出已经load下的档案uri
content://com.android.externalstorage.documents/document/primary%3ANordic%20Semiconductor%2Fnrf52832_xxaa_s132.bin
接着我开始改 code
我就直接用上面这串
利用 Uri.parser("xxxxx") 来丢到 743行的 mFileStreamUri
最后APK却说找不到档案,我怀疑是 URI的转换问题让APK无法找到bin file,另
一个可能就是464行的restartLoader的问题,我把455~464 663~665 mark掉了。
也就是不透过其他APP例如档案管理APK来加载档案,直接写死要上传的档案的uri
既然客户希望按个 button,就可以不用开启 loader 选取档案,那么有没有办法是
下了
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
startActivity(intent, SELECT_FILE_REQ));
可以不用由客户去选档,就指定给他路径了呢?
还有我的URI可以这样 assign吗...?
作者: ssccg (23)   2017-06-20 12:57:00
就没权限存取那个位置的档案啊这个URI是个content uri,是跟系统的DocumentProvider取
楼主: gn00618777 (非常念旧)   2017-06-20 15:12:00
或是我可以设定 ACTION_GET_CONTENT后可以直接存取某个特定的档案吗,不用经由客户来选?setDataAndType好像也不能直接选取到我要的档案..
作者: ssccg (23)   2017-06-20 15:14:00
MANAGE_DOCUMENTS不是第三方App可以要的权限问题不是在用ACTION_GET_CONTENT要,而是你要到的这个URI是content uri。你现在要存取的这个档案是你可以控制的? 直接看它放在哪然后用file://的URI就可以了吧
楼主: gn00618777 (非常念旧)   2017-06-20 15:33:00
s大感谢你的回复。 你说可以控制的是指档案格式还是存放位址还是 URI 的 scheme?从S大的回复是指这个 bin 我可以用 file://的URI去设?经你一说我有看DfuActivity 有关于判断得到的uri是属于 sheme 是 file 或是 content的设置
作者: ssccg (23)   2017-06-20 15:48:00
content是找某个ContentProvider要,必须符合该Provider的限制,例如现在这个com.android.externalstorage.documents要求app必须就是当初用ACTION_GET_CONTENT跟它要的那个appfile是看如果是app自己的目录就没任何限制,如果是共用的目录要READ_EXTERNAL_STORAGE权限,如果是系统目录就不能存取用content的可能还是对应到某个档案,但是用content去存取跟直接用file存取,遇到的限制就会不同如果你能控制那档案放哪,就放在能取的地方然后用file
楼主: gn00618777 (非常念旧)   2017-06-20 16:18:00
s大,我有更新4,请您看一下我的理解对不对?
作者: ssccg (23)   2017-06-20 16:32:00
不知道你说的loader是指哪个...ACTION_GET_CONTENT回来的uri的权限是档案管理app给的,但是档案管理app里面实作当然有可能是再跟别人取的重点是你到底能不能直接存取那个档案? 还是除了那个contentURI以外你现在根本不知道那个档案在哪?
楼主: gn00618777 (非常念旧)   2017-06-20 16:59:00
那个档案存放的地方我可以决定,事实上我刚刚在搜寻怎样将我要load的档案转成用file://表示的URI目前我用 File file = new File(Runtime.getExternal)StorageDirectory().toString() + "/Download/", name再用file.exists()先确认有没有存在再用 Uri uri = Uri.fromFile(tmpFile);还不确定能不能用此Uri来更新 firmware,稍后测试
作者: paulku (苍木浩介.改)   2017-06-20 17:45:00
我工作上是恶搞啦 ASSETS复制出去后在指定那位置更新更新成功后在onTransferCompleted阶段删档这样就不太用大改程式了....只是要多要读写权限就是了反正跟客户说 因为更新设备 所以要读写档案就呼咙过去了..这是不好的示范就是了.....
楼主: gn00618777 (非常念旧)   2017-06-20 18:05:00
天啊 我成功了>"<<>"< 太感谢了.....真的是很感谢..不太懂P大说的内容..那这样content的使用时机是啥,file://比较好用阿..
作者: ssccg (23)   2017-06-20 18:32:00
asset如果在同个app不用复制,用file:///android_assets/可以直接存取content是跟ContentProvider要,ContentProvider的实作不一定是取档案,可能从任何地方来,跟file是不同的概念
作者: bukiya (武器店)   2017-06-20 18:47:00
Android N上uri有限制file://的使用,要注意一下
楼主: gn00618777 (非常念旧)   2017-06-20 18:53:00
p大以啥限制?我目前就是在N上开发
作者: ssccg (23)   2017-06-20 18:57:00
N之后不能share file uri给别的app,在同一个app里没关系
楼主: gn00618777 (非常念旧)   2017-06-21 16:00:00
了解,谢谢分享

Links booklink

Contact Us: admin [ a t ] ucptt.com