最近在寫一個(gè)安卓爐石記牌器,需要訪問爐石app外部存儲(chǔ)目錄來寫入配置文件和讀取log日志,也是就是需要讀取某個(gè)制定app的外部存儲(chǔ)目錄。下面是具體步驟:
1,不需要再清單文件里面申請(qǐng)權(quán)限
2谆刨,創(chuàng)建請(qǐng)求訪問Data目錄權(quán)限合約
class RequestAccessAppDataDir : ActivityResultContract<String, Uri?>() {
override fun createIntent(context: Context, input: String): Intent {
val dirUri = createAppDataDirUri(input)
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.flags = (Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
val documentFile = DocumentFile.fromTreeUri(context.applicationContext, dirUri)!!
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentFile.uri)
return intent
}
override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
return intent?.data
}
}
3,創(chuàng)建啟動(dòng)器
///請(qǐng)求訪問目標(biāo)app的data目錄
val requestAccessDataDirLauncher = registerForActivityResult(RequestAccessAppDataDir()) {
if (it != null) {
contentResolver.takePersistableUriPermission(
it,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
}
啟動(dòng)回調(diào)里面的代碼意思是:如果成功归斤,就請(qǐng)求持久訪問該目錄的權(quán)限痊夭,否則下次就不能訪問了
4,啟動(dòng)啟動(dòng)器
requestAccessDataDirLauncher.launch(targetPackageName ?: "")
targetPackageName的意思是目標(biāo)app的包名
5脏里,同意授權(quán)
這個(gè)頁面在不同系統(tǒng)版本會(huì)有差異
6她我,結(jié)束
當(dāng)用戶同意授權(quán)返回后,就能對(duì)目標(biāo)app的data目錄進(jìn)行操作了迫横。