无法获得管理外部存储权限

问题描述 投票:0回答:1

在此文档扫描仪应用程序中,我访问了存储照片并导入到我的应用程序中,但我还想编写外部存储以在外部存储中创建一个文件夹,我可以在其中存储文档。仅出现一个请求访问照片权限的权限对话框,而没有出现另一个有关允许用户管理存储的权限对话框。

我尝试获取读取和写入外部存储(管理外部存储),我可以读取存储,但无法管理它以在本地存储中创建文件夹。如果不管理外部存储,应用程序会在保存文档时崩溃。我还尝试在应用程序信息设置中手动获取权限,效果很好。但需要从应用程序获取用户的权限。

@Composable
fun setupScanner() {
    val options = GmsDocumentScannerOptions.Builder()
        .setGalleryImportAllowed(true)
        .setResultFormats(RESULT_FORMAT_JPEG, RESULT_FORMAT_PDF)
        .setScannerMode(SCANNER_MODE_FULL)
        .build()
    val scanner = GmsDocumentScanning.getClient(options)

    Text(text = "Welcome to ScanWush")

    // A surface container using the 'background' color from the theme
    Surface(
        modifier = Modifier.fillMaxWidth(),
        color = MaterialTheme.colorScheme.background,
    ) {
        var imageUris by remember {
            mutableStateOf<List<Uri>>(emptyList())
        }
        val scannerLauncher =
            rememberLauncherForActivityResult(
                contract = ActivityResultContracts.StartIntentSenderForResult(),
                onResult = {
                    if (it.resultCode == RESULT_OK) {
                        val result =
                            GmsDocumentScanningResult.fromActivityResultIntent(it.data)
                        imageUris = result?.pages?.map { it.imageUri } ?: emptyList()
                        result?.pdf.let { pdf ->
                            val docName = UUID.randomUUID().toString()
                            val folderName = "ScanWush"
                            val folder =
                                File(Environment.getExternalStorageDirectory(), folderName)
                            if (!folder.exists()) {
                                folder.mkdir()
                            }
                            val file = File(folder, "$docName.pdf")
                            val fos = FileOutputStream(file)
                            pdf?.let { it1 ->
                                contentResolver.openInputStream(it1.uri)?.use {
                                    it.copyTo(fos)
                                    Toast.makeText(
                                        this,
                                        "Saved to ScanWush Folder",
                                        Toast.LENGTH_SHORT,
                                    ).show()
                                }
                            }
                        }
                    }
                },
            )
        Column(
            modifier = Modifier
                .fillMaxSize()
                .verticalScroll(rememberScrollState()),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            AsyncImage(
                model = imageUris,
                contentDescription = null,
                contentScale = ContentScale.FillWidth,
                modifier = Modifier.fillMaxWidth(),
            )
            Spacer(modifier = Modifier.height(16.dp)) // Add some space between the image and the button

            Text(text = "Welcome to ScanWush")
            Spacer(modifier = Modifier.height(16.dp)) // Add some space between the image and the button
            Button(onClick = {
                if (ContextCompat.checkSelfPermission(
                        this@MainActivity,
                        android.Manifest.permission.READ_EXTERNAL_STORAGE
                    ) != PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(
                        this@MainActivity,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
                    ) != PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(
                        this@MainActivity,
                        android.Manifest.permission.MANAGE_EXTERNAL_STORAGE
                    ) != PackageManager.PERMISSION_GRANTED
                ) {
                    ActivityCompat.requestPermissions(
                        this@MainActivity,
                        arrayOf(
                            android.Manifest.permission.READ_EXTERNAL_STORAGE,
                            android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            android.Manifest.permission.MANAGE_EXTERNAL_STORAGE
                        ),
                        1,
                    )
                } else {
                    scanner.getStartScanIntent(this@MainActivity).addOnSuccessListener {
                        scannerLauncher.launch(
                            IntentSenderRequest.Builder(it).build()
                        )
                    }.addOnFailureListener {
                        Toast.makeText(
                            applicationContext,
                            it.message,
                            Toast.LENGTH_SHORT,
                        ).show()
                    }
                }
            }, modifier = Modifier.background(Color.White)) {
                Text(text = ("Scan PDF"))
            }
        }
    }
}
android kotlin android-jetpack-compose android-storage
1个回答
0
投票

MANAGE_EXTERNAL_STORAGE
不是
dangerous
权限,因此您无法在运行时请求它。您可以启动活动来请求权限

请注意,除非您证明使用此权限的合理性,否则您的应用程序将不被允许在 Play 商店上分发。这将很难证明其合理性。请考虑改用存储访问框架,例如

ACTION_OPEN_DOCUMENT_TREE
/
ActivityResultContracts.OpenDocumentTree

© www.soinside.com 2019 - 2024. All rights reserved.