大学生
 
- 金币
- 605
- 好评
- 6
- 信誉
- 100
|
本帖最后由 chenminghui 于 2023-7-26 18:48 编辑
package com.fa
import android.Manifest
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.DocumentsContract
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.documentfile.provider.DocumentFile
import com.fa.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val requestAccessDataDirLauncher = registerForActivityResult(RequestAccessAppDataDir()) {
if (it != null) {
contentResolver.takePersistableUriPermission(
it,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
}
binding.requestPermission.setOnClickListener {
requestAccessDataDirLauncher.launch(targetPackageName ?: "")
}
}
private val targetPackageName: String?
get() = binding.targetPackageName.text?.toString()
}
private fun createAppDataDirUri(packageName: String) =
Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata%2F${packageName}")!!
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
}
}
界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@drawable/a"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="目标包名"
android:layout_margin="8dp">
<com.google.android.material.textfield.TextInputEditText
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/target_package_name"
android:text="com.tencent.ngame.chty" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_margin="8dp"
android:id="@+id/check_permission"
android:text="检查权限" />
<Button
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_margin="8dp"
android:id="@+id/request_permission"
android:text="访问权限" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
项目已发评论群 |
|