[問題] 關於Uri
我是抓取 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嗎...?-->主要還是想知道為啥找不到檔案
如果有甚麼資訊或指教請不吝說明,謝謝。
-----------------------------------------------------------------------------
更新1: 查看了 logcat 出現了權限相關訊息
6-20 11:49:38.395 19930 19941 E DatabaseUtils: Writing exception to parcel
06-20 11:49:38.395 19930 19941 E DatabaseUtils: java.lang.SecurityException:
Permission Denial: reading
com.android.externalstorage.ExternalStorageProvider uri
content://com.android.externalstorage.documents/document/primary%3ANordic%20Semiconductor%2Fnrf52832_xxaa_s132.bin
from pid=20023, uid=10259 requires android.permission.MANAGE_DOCUMENTS, or
grantUriPermission()
更新2: 他下面還有關於 DfuBaseService 一樣權限的問題..,我下個步驟是要抓這個
DfuBaseService 的 code 在 mainifest.xml加上權限看看
6-20 12:20:55.858 21818 21831 E DatabaseUtils: java.lang.SecurityException:
Permission Denial: reading
com.android.externalstorage.ExternalStorageProvider uri
content://com.android.externalstorage.documents/document/primary%3ANordic%20Semiconductor%2Fnrf52832_xxaa_s132.bin
from pid=21436, uid=10259 requires android.permission.MANAGE_DOCUMENTS, or
grantUriPermission()
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:608)
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:483)
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:474)
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:419)
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.content.ContentProviderNative.onTransact(ContentProviderNative.java:319)
06-20 12:20:55.858 21818 21831 E DatabaseUtils: at
android.os.Binder.execTransact(Binder.java:565)
06-20 12:20:55.859 21436 21845 E DfuBaseService: A security exception
occurred while opening file
06-20 12:20:55.859 21436 21845 E DfuBaseService: java.lang.SecurityException:
Permission Denial: reading
com.android.externalstorage.ExternalStorageProvider uri
content://com.android.externalstorage.documents/document/primary%3ANordic%20Semiconductor%2Fnrf52832_xxaa_s132.bin
from pid=21436, uid=10259 requires android.permission.MANAGE_DOCUMENTS, or
grantUriPermission()
更新3: 我將 DFU library 抓下來,在mainifest.xml加上
<uses-permission android:name="android.permission.MANAGE_DOCUMENT
無效...
有沒有啥解法...?感謝
更新4: 這是某段註解,就像s大說的可以用file或者content。
* The URI returned from application may be in 'file' or 'content' schema.
'File' schema allows us to create a File object and read details from if
* directly. Data from 'Content' schema must be read by Content Provider.
To do that we are using a Loader.*/
我的APP 獲得到的 content,最後給 dfu library內的 DfuBaseService來讀取,讀取不了
的原因是因為沒有權限。我可以理解為- DfuBaseService 沒有那個權限,而這個權限
是由系統的Loader提供的嗎? ACTION_GET_CONTENT一發出,會可以讓我選擇適合的
檔案管理APK來載入檔案,所以說這個權限是由這個檔案管理的APK提供的嗎?
這個權限到底是 loader 給的還是檔案管理apk給的~"~? 是系統的loader吧?
所以我的app才需要實作loader相關的function?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.115.110.197
※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1497886262.A.A02.html
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 10:17:43
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 12:01:05
→
06/20 12:57, , 1F
06/20 12:57, 1F
→
06/20 13:03, , 2F
06/20 13:03, 2F
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 13:30:52
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 14:57:31
→
06/20 15:12, , 3F
06/20 15:12, 3F
→
06/20 15:13, , 4F
06/20 15:13, 4F
→
06/20 15:13, , 5F
06/20 15:13, 5F
→
06/20 15:14, , 6F
06/20 15:14, 6F
→
06/20 15:18, , 7F
06/20 15:18, 7F
→
06/20 15:20, , 8F
06/20 15:20, 8F
→
06/20 15:20, , 9F
06/20 15:20, 9F
→
06/20 15:33, , 10F
06/20 15:33, 10F
→
06/20 15:34, , 11F
06/20 15:34, 11F
→
06/20 15:37, , 12F
06/20 15:37, 12F
→
06/20 15:44, , 13F
06/20 15:44, 13F
→
06/20 15:44, , 14F
06/20 15:44, 14F
→
06/20 15:48, , 15F
06/20 15:48, 15F
→
06/20 15:48, , 16F
06/20 15:48, 16F
→
06/20 15:50, , 17F
06/20 15:50, 17F
→
06/20 15:52, , 18F
06/20 15:52, 18F
→
06/20 15:53, , 19F
06/20 15:53, 19F
→
06/20 15:54, , 20F
06/20 15:54, 20F
→
06/20 15:54, , 21F
06/20 15:54, 21F
→
06/20 15:57, , 22F
06/20 15:57, 22F
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 16:17:40
→
06/20 16:18, , 23F
06/20 16:18, 23F
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 16:21:17
※ 編輯: gn00618777 (61.220.69.181), 06/20/2017 16:25:02
→
06/20 16:32, , 24F
06/20 16:32, 24F
→
06/20 16:32, , 25F
06/20 16:32, 25F
→
06/20 16:34, , 26F
06/20 16:34, 26F
→
06/20 16:35, , 27F
06/20 16:35, 27F
→
06/20 16:35, , 28F
06/20 16:35, 28F
→
06/20 16:59, , 29F
06/20 16:59, 29F
→
06/20 17:00, , 30F
06/20 17:00, 30F
→
06/20 17:01, , 31F
06/20 17:01, 31F
→
06/20 17:02, , 32F
06/20 17:02, 32F
→
06/20 17:02, , 33F
06/20 17:02, 33F
→
06/20 17:03, , 34F
06/20 17:03, 34F
→
06/20 17:04, , 35F
06/20 17:04, 35F
推
06/20 17:45, , 36F
06/20 17:45, 36F
→
06/20 17:46, , 37F
06/20 17:46, 37F
→
06/20 17:47, , 38F
06/20 17:47, 38F
→
06/20 17:47, , 39F
06/20 17:47, 39F
→
06/20 17:47, , 40F
06/20 17:47, 40F
→
06/20 18:05, , 41F
06/20 18:05, 41F
→
06/20 18:06, , 42F
06/20 18:06, 42F
→
06/20 18:07, , 43F
06/20 18:07, 43F
→
06/20 18:32, , 44F
06/20 18:32, 44F
→
06/20 18:33, , 45F
06/20 18:33, 45F
→
06/20 18:35, , 46F
06/20 18:35, 46F
→
06/20 18:36, , 47F
06/20 18:36, 47F
→
06/20 18:47, , 48F
06/20 18:47, 48F
→
06/20 18:53, , 49F
06/20 18:53, 49F
→
06/20 18:57, , 50F
06/20 18:57, 50F
→
06/21 16:00, , 51F
06/21 16:00, 51F
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章