sdandroid許可權
A. Android6.0的sd卡許可權怎麼搞
安卓6.0加入了更嚴格得許可權驗證,SD卡讀寫許可權是這樣得
1. 在AndroidManifest.xml添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 現在大應用一般都匯集成進去許可權框架,這樣在你讀寫SD卡得時候判斷有沒有許可權,有的話執行,沒有的話彈出添加許可權對話框點擊確定添加許可權。
3.現在許可權框架比較多有EasyPermission,PermissionGen 和 MPermissions。
4.EasyPermission修改了一個框架library,可直接使用
B. 如何編程設置android模擬器 sd卡的讀寫許可權
android改寫sd卡的許可權途徑:
設置DDMS(File
Explorer)目錄下的sdcard目錄的許可權
1、打開cmd命令
2、輸入adb
shell(成功後進入adb的root用戶狀態#)
3、你可以用
ls
命令看下當前文件夾下目錄,你會發現sdcard目錄在這下面
4、修改sdcard許可權,因為此時sdcard是only-read的狀態,
5、修改目錄命令:chmod
075
(不要直接用777,不能成功執行的)
6、sdcard目錄的讀寫許可權修改完成。可在其中導入文件。
C. Android許可權機制
我們知道 Android 應用程序是沙箱隔離的,每個應用都有一個只有自己具有讀寫許可權的專用數據目錄。但是如果應用要訪問別人的組件或者一些設備上全局可訪問的資源,這時候許可權機制就能系統化地規范並強制各類應用程序的行為准則。
Android 安全性概覽
在 Android 中,一個許可權,本質上是一個字元串,一個可以表示執行特定操作的能力的字元串。比如說:訪問 SD 卡的能力,訪問通訊錄的能力,啟動或訪問一個第三方應用中的組件的能力。 許可權被授予了之後,首先會在內存和本地中有記錄,這在調用系統binder服務和其他應用組件時做鑒權依據,比如調用系統binder服務時會通過Binder.getCallingUid()拿到調用者的Uid,而Uid一般都是與應用包名一一對應的,再拿這個Uid到PMS里去查這個應用對應的許可權。 其次會按被授予的許可權將應用分到某個組。 可以參考 https://www.jianshu.com/p/a17c8bed79d9
自定義許可權的應用場景在於限制其它應用對本應用四大組件的訪問。具體用法可以參考 https://www.cnblogs.com/aimqqroad-13/p/8927179.html
pm list permissions -f 命令可以詳細查看 Android 所有預定義的許可權。
更詳細的許可權信息參考 https://developer.android.com/reference/android/Manifest.permission?hl=zh-cn#WRITE_EXTERNAL_STORAGE
可以看到一個許可權的信息包括:定義的包名、標簽、描述、 許可權組 和 保護級別 。
許可權根據設備的功能或特性分為多個組。如果應用已在相同許可權組中被授予另一危險許可權,系統將立即授予該許可權,如READ_CONTACTS和WRITE_CONTACTS。
SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 由於其特殊性,其申請方式與其它許可權都不同。
其授予流程如下:
(關於 AppOpsManager 是什麼可以參考: https://segmentfault.com/a/1190000009214983 )
這里簡要分析下ActivityCompat#requestPermissions的流程:
更詳細的許可權授予流程源碼分析可以參考: https://segmentfault.com/a/1190000009214983
普通許可權: 清單文件中聲明即可。
危險許可權: 方式一: pm grant application_package android.permission.CHANGE_CONFIGURATION 方式二:appops set application_package permission_num 0/1
appops可以授予的許可權參考 android.app.AppOpsManager 中的聲明
系統簽名許可權: 方式一:將app遷移到system/priv-app目錄中。 方式二:看不懂,參考 https://blog.csdn.net/abcd_3344_abcd/article/details/50698759
android 4.4 訪問sd卡需要申請許可權。 您的應用在 Android 4.4 上運行時無法讀取外部存儲空間上的共享文件,除非您的應用具有 READ_EXTERNAL_STORAGE 許可權。也就是說,沒有此許可權,您無法再訪問 () 返回的目錄中的文件。但是,如果您僅需要訪問 getExternalFilesDir() 提供的您的應用特有目錄,那麼,您不需要 READ_EXTERNAL_STORAGE `許可權。
android 6.0 運行時許可權。 此版本引入了一種新的許可權模式,如今,用戶可直接在運行時管理應用許可權。這種模式讓用戶能夠更好地了解和控制許可權,同時為應用開發者精簡了安裝和自動更新過程。用戶可為所安裝的各個應用分別授予或撤銷許可權。 對於以 Android 6.0(API 級別 23)或更高版本為目標平台的應用,請務必在運行時檢查和請求許可權。要確定您的應用是否已被授予許可權,請調用新增的 checkSelfPermission() 方法。要請求許可權,請調用新增的 requestPermissions() 方法。即使您的應用並不以 Android 6.0(API 級別 23)為目標平台,您也應該在新許可權模式下測試您的應用。 如需了解有關在您的應用中支持新許可權模式的詳情,請參閱 使用系統許可權 。如需了解有關如何評估新模式對應用的影響的提示,請參閱 許可權最佳做法 。
android 7.+ 應用間共享文件要使用FileProvider。 對於面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file://URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,並出現 FileUriExposedException 異常。 要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問許可權。進行此授權的最簡單方式是使用 FileProvider `類。如需了解有關許可權和共享文件的詳細信息,請參閱 共享文件 。
android 8.+
同一許可權組的許可權在被授予了之後也需要顯式的再申請一次。
在 Android 8.0 之前,如果應用在運行時請求許可權並且被授予該許可權,系統會錯誤地將屬於同一許可權組並且在清單中注冊的其他許可權也一起授予應用。 對於針對 Android 8.0 的應用,此行為已被糾正。系統只會授予應用明確請求的許可權。然而,一旦用戶為應用授予某個許可權,則所有後續對該許可權組中許可權的請求都將被自動批准。 例如,假設某個應用在其清單中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 。應用請求 READ_EXTERNAL_STORAGE ,並且用戶授予了該許可權。如果該應用針對的是 API 級別 24 或更低級別,系統還會同時授予 WRITE_EXTERNAL_STORAGE ,因為該許可權也屬於同一 STORAGE 許可權組並且也在清單中注冊過。如果該應用針對的是 Android 8.0,則系統此時僅會授予 READ_EXTERNAL_STORAGE ;不過,如果該應用後來又請求 WRITE_EXTERNAL_STORAGE ,則系統會立即授予該許可權,而不會提示用戶。
android 9
隱私許可權變更。
為了增強用戶隱私,Android 9 引入了若干行為變更,如限制後台應用訪問設備感測器、限制通過 Wi-Fi 掃描檢索到的信息,以及與通話、手機狀態和 Wi-Fi 掃描相關的新許可權規則和許可權組。
android 10
隱私權變更。
外部存儲訪問許可權范圍限定為應用文件和媒體,在後台運行時訪問設備位置信息需要許可權,針對從後台啟動 Activity 的限制等。
android 11
隱私許可權變更。
更詳細的版本變更請參考 https://developer.android.com/preview/privacy?hl=zh-cn
D. Android6.0的sd卡許可權怎麼搞
首先手機必須獲取了root許可權
打開re文件管理器並找到
etc\permissions\platform.xml
這個文件
將文件的只讀屬性改為讀寫屬性並用文本編輯器打開這個文件
找到
這一串字元,在下面添加
即可
添加完保存退出重啟手機,第三方app就有了在sd卡上寫入數據的許可權了
望採納謝謝
E. 關於Android許可權申請
1、手動申請
Android6.0之後系統對許可權的管理更加嚴格了,不但要在AndroidManifest中添加,還要在應用運行的時候動態申請。下面是動態申請SD卡讀寫的許可權
在AndroidManifest中添加SD卡讀寫的許可權
動態申請許可權
把verifyStoragePermissions方法放在onCreate方法中即可。
2、默認申請
https://github.com/Karumi/Dexter
通過上面庫,接入方式:
在build.gradle加入
然後在mainactivity加入
然後在oncreate()中加入initPermissions()就行了
以上兩種方法,親測可用。
F. 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卡中數據進行操作。
G. 如何在 Android 5.0 上獲取 SD卡 的讀寫許可權
1.首先請安裝「Root
Explorer」這個app,它可以在已ROOT的手機中管理隱藏的系統核心檔案。
2.安裝完成並開啟Root
Explorer以後,展開「/system/etc/permissions/」路徑,然後在「platform.xml」上長按。
3.跳出「Options」選單以後,先按一下「Permissions」,我們要更改檔案的許可權才能寫入文字。
4.此時會跳出一個警告訊息,告知你目前系統內的檔案為唯讀模式,需先更改為讀寫模式,按下「Yes」即可更改。
5.更改完成以後,將「Read」、「Write」、「Execute」項目都勾起來,然後按一下「OK」。
6.許可權更改完成以後,再次在「platform.xml」上長按一次。
7.跳出「Options」選單以後,這次我們點擊「Open
With」,選擇用哪個app開啟此檔案。
8.看到顯示了一堆app,我們選擇用「Text
Viewer」來開啟,如果讀者們有其他的文字編輯app,也可以用它來開啟。
9.找到以下兩段文字以後,將內容改成跟底下一樣:
10.更改完成以後,點擊一下叫出選單,點擊「Save
Changes」儲存更改,然後離開即可。
11.儲存成功以後,可以看到資料夾中多了一個「platform.xml.bak」檔案,往後要還原時,只要將「platform.xml」刪除,然後把「platform.xml.bak」更改回原來名稱即可。
12.最後重新開啟手機,即可讓設定生效羅!
NOTE:
坊間已經有直接可以修改SD卡寫入許可權的app出現,但因為安全因素,我們還是自行手動修改比較安全。
H. 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
到此為止,
I. 安卓手機外置sd卡的許可權怎麼打開
其實只有最後一句才是客戶端手機用戶利益立場所關心的,前面一大坨全都碼農利益方的全都廢話,和一般用戶無關!但就是這一句也又是亂搬運的說法吧,早已實踐證明過這個做法完全錯的,這個只不過APP自身的存儲位置罷了,並不是APP所操作各種文件時的許可權設置,完全無關的,大家別被它誤導了!他這搬運來的道聽途說網上早已有過也被證明過是大錯喲
J. android Q sdcard許可權詳解
默認情況下,如果應用以 Android Q 為目標平台,則在訪問外部存儲設備中的文件時會進入過濾視圖。應用可以使用 Context.getExternalFilesDir() 將專用於自己的文件存儲在特定於自己的目錄中。
1. 臨時停用分區存儲行為:
2. 如何實現隔離存儲:
2.1 ApplicationInfo新增PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE標記
PackageParser.java:
ApplicationInfo.java:
2.2 grantRuntimePermission()重新掛載視圖
apk啟動時默認掛載runtime/default視圖,grantRuntimePermission()時如果是READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE,則會獲取掛載模式重新掛載對應視圖。
PermissionManagerService.java:
獲取掛載模式這塊android10有修改,沒有設置Legacy標志的話,總是獲取default掛載模式,沒有讀寫許可權。
android 10會設置屬性[persist.sys.isolated_storage]: [true],因此走到if(ENABLE_ISOLATED_STORAGE)中的getMountMode()。
正常模式下hasLegacy=false,走到if判斷的DEFAULT分支;legacy模式hasLegacy=true,與之前保持一致,有write許可權就走到WRITE模式分支。
2.3 Legacy Storage屬性對許可權的影響
安裝apk時,就會根據requestLegacyExternalStorage屬性來對ops state進行設置,修改OP_LEGACY_STORAGE的默認狀態。
PermissionPolicyService啟動時首先進行許可權變化監聽:
APK安裝時,會根據requestLegacyExternalStorage屬性來通知storage許可權變化,調用關系如下:
最終調用到PermissionPolicyService的監聽函數(),進行默認許可權獲取和設置。
當apk安裝時,聲明了requestLegacyExternalStorage="true"屬性,並且聲明了READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE,那麼addOpIfRestricted()就會將LEGACY_STORAGE設置為allow模式。
3. sdcard路徑許可權說明:
/mnt/runtime/default:
/mnt/runtime/read:
/mnt/runtime/write:
/sdcard/Android/data:
4. sdcard文件存儲示例:
4.1 getExternalFilesDir()隨卸載而刪除
4.2 媒體文件
媒體文件使用MediaStore操作,卸載後不會刪除。
訪問其他應用生成的照片、視頻、音頻,需要READ_EXTERNAL_STORAGE許可權。
4.3 存儲訪問框架(SAF)
訪問其他應用創建的文件,例如"Download"目錄,必須使用存儲訪問框架,用戶通過框架選擇特定文件。
4.4 照片中的位置信息
需要ACCESS_MEDIA_LOCATION許可權,才能獲取元數據中的位置信息。