在此文档扫描仪应用程序中,我访问了存储照片并导入到我的应用程序中,但我还想编写外部存储以在外部存储中创建一个文件夹,我可以在其中存储文档。仅出现一个请求访问照片权限的权限对话框,而没有出现另一个有关允许用户管理存储的权限对话框。
我尝试获取读取和写入外部存储(管理外部存储),我可以读取存储,但无法管理它以在本地存储中创建文件夹。如果不管理外部存储,应用程序会在保存文档时崩溃。我还尝试在应用程序信息设置中手动获取权限,效果很好。但需要从应用程序获取用户的权限。
@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"))
}
}
}
}
MANAGE_EXTERNAL_STORAGE
不是 dangerous
权限,因此您无法在运行时请求它。您可以启动活动来请求权限。
请注意,除非您证明使用此权限的合理性,否则您的应用程序将不被允许在 Play 商店上分发。这将很难证明其合理性。请考虑改用存储访问框架,例如
ACTION_OPEN_DOCUMENT_TREE
/ ActivityResultContracts.OpenDocumentTree
。