導航:首頁 > 版本升級 > android文件讀寫許可權

android文件讀寫許可權

發布時間:2023-02-11 01:48:17

① Android 6.0 讀寫SD卡許可權問題

Android 6.0 下默認存儲SD卡,使用原生FMRadio生成的文件保存到內部存儲中
【預置條件】插入T卡【操作步驟】設置>存儲設備和USB>選擇SD卡為默認存儲>收音機錄音【實際結果】收音機的錄音文件未保存到T卡【預期結果】收音機的錄音文件保存到T卡【復現概率】10/10
此外,SoundRecorder默認存儲SD卡,生成的文件卻可以保存到SD卡中

1、收音機文件沒有保存到指定的SD卡目錄下,因此可能是文件的路徑不對。
2、進入設置中,切換默認存儲位置,內部存儲或者SD卡,每次切換都會修改系統中某一屬性值。
3、當收音機文件保存的時候,必須要讀取當前系統的默認存儲路徑,然後生成自己的文件路徑。

STEP1、初步解決方案,但沒有生效,引入新問題
對比 SoundRecorder ,根據GIT庫中,之前的同事的修改記錄,找到可能的解決方案,修改如下:

引入新的問題,此時,點擊 Start Recording 會提示內部錯誤。
分析Log發現,由於許可權拒絕,拋出IO異常
01-01 07:35:38.167 7467 7467 W System.err: java.io .IOException: open failed: EACCES (Permission denied)

STEP2、Android M 下SD卡讀寫許可權問題
分析由於許可權問題後,結合Android M new design,開始查找文檔,尋找解決Android M 下SD卡讀寫許可權問題
Android6.0中的運行時請求許可權
後來,試了好幾種方法,但都沒有用,以及報問題「EACCES (Permission denied)」

STEP3、再分析可能是運行時許可權問題
判斷APP運行時許可權如下:

發現此時,FMRadio對於的組許可權如下:
com.android.fmradio Groups: 1013 3002 3003 9997 50010
com.android.soundrecorder Groups: 1015 1023 3003 9997 50105

根據 系統許可權 的定義,有興趣的同學可以去看一下這個文件 system/core/include/private/android_filesystem_config.h
分析這些Gid發現:
1015 為sdcard_rw,1023 為media_rw許可權
因此,得出結論如下
1、首先修改AndroidManifest.xml文件,新增許可權,確保FMRadio應用級的許可權;
2、原生FMRadio使用過程中,會進行運行時的許可權檢查,故FMRadio運行時應該拿到了WRITE_EXTERNAL_STORAGE,以及READ_EXTERNAL_STORAGE許可權,
3、但是由於FMRadio本身不具備「1015,1023」組許可權,這些許可權無效,仍然無法對SD卡進行讀寫操作。

STEP4、最終解決方案
STEP1 的修改基礎上,在框架層,許可權對應組中給予FMRadio相應的組許可權,新增修改如下:
frameworks/base/data/etc/platform.xml

重編framework.jar, 將修改後的jar文件push到手機,重啟
此時,再檢查FMRadio對於的組許可權如下:
com.android.fmradio Groups: 1013** 1015 1023** 3002 3003 9997 50010

到此為止,

② Android動態獲取許可權,Android 10 讀取本地文件許可權解決方案

在BaseActivity里寫授權申請,首先檢查申請的許可權是不是被授權了,如果不是就加入待授權數組里,去申請許可權。如果全部已授權,就直接回掉授權成功。

然後重寫授權返回方法。系統會返回2個數組, String[] permissions是你申請的許可權,int[] grantResults是授權結果。拿出授權結果比對,如果授權,加入授權數組,如果拒絕,加入拒絕數組。回掉給注冊PermissionListener的activity

解決辦法:

③ Android 內部存儲/外部存儲 及 讀寫許可權

Android 使用 VFS (Virtual File System) 虛擬文件系統。VFS提供了供存儲設備掛載的節點,同一存儲設備經過分區後,不同的分區可以掛載到不同的節點上,如手機的內置存儲卡。

內置存儲卡 / 外置SD卡
內部存儲 / 外部存儲

VFS 的目錄以 / 為根節點,根節點下面又有不同的節點。物理存儲設備就是掛載到這些節點上。

內部存儲卡/外置SD卡 內部存儲/外部存儲

首先明確, 內置存儲卡/外置SD卡 是在 物理層面 相對於 手機大眾用戶 來說的。
外置SD卡:可手動插拔的SD卡。
內置存儲卡:焊接在手機內部不可拆卸的存儲卡。

而, 內部存 /外部存儲 是在 文件系統邏輯層面 相對於 開發者 來說的,指具體的路徑。
一般針對某個應用而言的,屬於該應用的存儲路徑叫內部存儲,反之為外部存儲。

路徑: /data/data/package_name

/data/data/ 下都是已安裝應用的目錄,該目錄下包含的文件都是以包名作為文件名的目錄,例如 /data/data/com.sankuai.meituan

獲取內部存儲的方式如下:

其中,參數 mode 指創建模式,一種 4 種

注意: Android 7.0 以上 android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.N 使用3/4 常量時,將會導致SecurityException,這意味著 不能通過名稱共享私有文件
嘗試共享 file://URI URI將會導致FileUriExposedException,StrictMode API政策禁止在您的應用外部公開file://URL。如果您的應用需要與其他應用共享私有文件,則可以使用 FileProvider 與 FLAG_GRANT_READ_URI_PERMISSION 配合使用。 Android 7.0 行為變更 通過FileProvider在應用間共享文件吧

外部存儲,可以是 外置SD卡 或 內置存儲卡的部分分區。

外部存儲,分為 公共目錄 和 私有目錄

獲取方式

檢查可用性的方法:

Android 4.3 以下,只能通過 Context#getExternalFilesDir(type) 來獲取外部存儲在內置存儲卡分區的私有目錄,無法獲取外置SD卡。

Android 4.3 開始,可以通過 Context#getExternalFilesDirs(type) 獲取一個File數組,包含了內置存儲卡分區和外置SD的私有目錄地址。

可以使用兼容庫的靜態方法 ContextCompate.getExternalFilesDirs() 兼容 4.3。

感謝以下文章作者
解析Android內部存儲、外部存儲的區別

④ android P系統WRITE_MEDIA_STORAGE添加讀寫SD卡許可權

由於android P 版本google把android.Permission.WRITE_MEDIA_STORAGE中sd卡的讀寫許可權移除了,導致系統文件管理中的文件無法直接復制到SD卡,所以需要把SD卡的讀寫許可權加上到WRITE_MEDIA_STORAGE許可權中去,
方法一、
1、frameworks\base\data\etc\platform.xml中添加:

2、frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java

方法二、修改system\vold\model\PublicVolume.cpp

參考:
https://blog.csdn.net/ch853199769/article/details/88052886
https://blog.csdn.net/qq_27061049/article/details/93715885

⑤ android 讀寫文件需要哪些許可權

<!--往sdcard中寫入數據的許可權 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!--在sdcard中創建/刪除文件的許可權 --><uses-permission android:name="android.permission.MOUNT_U

  1. android中的apk必須簽名

    這種簽名不是基於權版威證書權的,不會決定某個應用允不允許安裝,而是一種自簽名證書。

    重要的是,android系統有的許可權是基於簽名的。比如:system等級的許可權有專門對應的簽名,簽名不對,許可權也就獲取不到。默認生成的APK文件是debug簽名的。

  2. 獲取system許可權時用到的簽名,見:如何使Android應用程序獲取系統許可權。基於UserID的進程級別的安全機。這種簽名不是基於權威證書的,不會決定某個應用允不允許安裝,而是一種自簽名證書。重要的是,android系統有的許可權是基於簽名的。

⑥ 【Android筆記】Android 9.0 SD卡讀寫許可權問題

Android 9.0 SD卡許可權管理更為嚴格,在項目測試中遇到以下問題:

[步驟]

1.在圖庫中刪除T卡上的圖片或者視頻,在文件管理中查看還存在

2.在視頻應用中刪除視頻情況一樣

[備注]重啟手機後,再次進入圖庫重新載入進來

跟蹤調試發現,是SD卡寫許可權被禁,用戶無法對SD卡內容進行操作。

原文分析

https://blog.csdn.net/shift_wwx/article/details/85633801

修改方法:

增加-w 許可權,下面第二個加上去的。

alps_p0_mp2\update\alps\system\vold\model\PublicVolume.cpp

    if (!(mFusePid = fork())) {

        if (getMountFlags() & MountFlags::kPrimary) {

            if (execl(kFusePath, kFusePath,

                    "-u", "1023", // AID_MEDIA_RW

                    "-g", "1023", // AID_MEDIA_RW

                    "-U", std::to_string(getMountUserId()).c_str(),

                    "-w",

                    mRawPath.c_str(),

                    stableName.c_str(),

                    NULL)) {

                PLOG(ERROR) << "Failed to exec";

            }

        } else {

            if (execl(kFusePath, kFusePath,

                    "-u", "1023", // AID_MEDIA_RW

                    "-g", "1023", // AID_MEDIA_RW

                    "-U", std::to_string(getMountUserId()).c_str(),

                    "-w",//add by   for add sdcard permission 就是這樣

                    mRawPath.c_str(),

                    stableName.c_str(),

                    NULL)) {

                PLOG(ERROR) << "Failed to exec";

            }

        }

這樣操作之後SD卡就有了寫許可權,用戶可以對SD卡中數據進行操作。

⑦ android怎麼在代碼里獲得系統文件的讀寫許可權

本來以為就沒有辦法在應用程序這一層改系統時間了,後來在網上搜了好久,知道這個目的還是可以達到的。
第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯:
1. 在應用程序的AndroidManifest.xml中的manifest節點中加入
android:sharedUserId="android.uid.system"這個屬性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。
第二個辦法麻煩點,不過不用開虛擬機跑到源碼環境下用make來編譯:
1. 同上,加入android:sharedUserId="android.uid.system"這個屬性。
2. 使用eclipse編譯出apk文件,但是這個apk文件是不能用的。
3. 用壓縮軟體打開apk文件,刪掉META-INF目錄下的CERT.SF和CERT.RSA兩個文件。
4. 使用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩,
首先找到密鑰文件,在我的Android源碼目錄中的位置
是"build argetproctsecurity",下面的platform.pk8和platform.x509.pem
兩個文件。
然後用Android提供的Signapk工具來簽名,signapk的源代碼是
在"build oolssignapk"下,
用法為"signapk platform.x509.pem platform.pk8 input.apk output.apk",
文件名最好使用絕對路徑防止找不到,也可以修改源代碼直接使用。
這樣最後得到的apk和第一個方法是一樣的。
最後解釋一下原理,首先加入android:sharedUserId="android.uid.system"這個屬性。通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中。那麼把程序的UID配成android.uid.system,也就是要讓程序運行在系統進程中,這樣就有許可權來修改系統時間了。
只是加入UID還不夠,如果這時候安裝APK的話發現無法安裝,提示簽名不符,原因是程序想要運行在系統進程中還要有目標系統的platform
key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名後apk才真正可以放入系統進程中。第一個方法中加入LOCAL_CERTIFICATE := platform其實就是用這兩個key來簽名。這也有一個問題,就是這樣生成的程序只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到 platform.pk8和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android 中的key來簽名,程序在模擬器上運行OK,不過放到G3上安裝直接提示"Package ... has no signatures that match those in shared user android.uid.system",這樣也是保護了系統的安全。

⑧ Android申請了讀寫許可權依舊無法創建文件夾

1.首先要保證在清單文件中注冊讀寫許可權:

2.如果是安卓6.0及以上的api,需要動態申請讀寫許可權

3.如果是api >= 29,需要在清單文件中增加如下配置

⑨ Android10讀寫文件許可權請求bug——open failed: EACCES (Permission denied)

在AndroidManifest.xml中聲明了 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ,卻還是報錯open failed: EACCES (Permission denied)。

問題的原因在於比如在安卓Q(10)開始,就採用存儲的分區控制。

解決方法:只能通過手動打開許可權,才能使用存儲許可權。
在AndroidManifest.xml的application標簽下新增 android:requestLegacyExternalStorage="true" 即可解決

⑩ android 怎麼讀寫許可權設置

在AndroidManifest.xml文件中添加一條寫內存卡的許可權即可 專<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 讀的許可權是默認屬有的無需添加 </a>

閱讀全文

與android文件讀寫許可權相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接