应用程序在相机/文件意图期间被杀死小米Android API 29

hk8txs48  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(142)

我对Kotlin- Compose中的几个应用程序感到有点头痛;我将直奔主题:

上下文

这个问题一直发生在运行API 29的小米设备上(10次中有9次)。我目前可用的设备(也存在这个问题)是小米Mi A2 Lite。

Emulator:在模拟器(API 29)中运行应用程序没有任何问题
**Manifest:**Manifest具有以下权限:

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

字符串

提供者路径:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-cache-path
        name="my_files_cached"
        path="." />

    <files-path
        name="my_files"
        path="."/>
</paths>

**摄像头权限:**摄像头和文件选取器组件在单击按钮时都会授予摄像头权限(请参阅代码部分中的代码片段)。

问题

1.在应用程序中启动ActivityResultContracts.TakePicture()ActivityResultContracts.GetContent()的启动器
1.在应用程序外部时,无论是在相机中还是在文件拾取器中,logcat都会写出--- PROCESS ENDED (16504) for package ... ----,表明应用程序已在后台被杀死
1.拍摄照片或选择文件,当返回应用程序时,会显示白色屏幕至少3-4秒,然后可以清楚地看到应用程序已重新创建。除此之外,内容(文件或照片)无法正确返回到应用程序(或在相机情况下,根本无法返回)。

代码

下面是用于处理相机照片捕捉的@Composable主体的片段(我没有发布文件拾取器代码以避免文本墙;考虑到它与相机相似):

val tmpFile = createTmpExtCachePhoto(photoFileName)

val context = LocalContext.current
var currentPhotoUri by remember { mutableStateOf(value = Uri.EMPTY) }
val uri = FileProvider.getUriForFile(
    Objects.requireNonNull(context),
    BuildConfig.APPLICATION_ID + ".provider", tmpFile
)

val cameraLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.TakePicture(),
    onResult = { success ->
        if (success) currentPhotoUri = uri
    }
)

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // Permission Accepted: Do something
        cameraLauncher.launch(uri)
    } else {
        // Permission Denied: Do something
        onCameraPermissionDenied.invoke()
    }
}

if (currentPhotoUri.toString().isNotEmpty()) {
    onImagePicked.invoke(currentPhotoUri.toString())
}

Button(
    modifier = modifier,
    colors = buttonColors,
    onClick = {
        // Check permission
        when (PackageManager.PERMISSION_GRANTED) {
            ContextCompat.checkSelfPermission(
                context,
                Manifest.permission.CAMERA
            ) -> {
                // Permission already given, perform operation
                cameraLauncher.launch(uri)
            }
            else -> {
                // Asking for permission
                launcher.launch(Manifest.permission.CAMERA)
            }
        }
    }
) {
    Text(text = buttonLabel)
}

情况

从我得到的信息来看,我认为在我的代码库中不应该有一个特定的问题,整个折磨似乎来自下面的系统,在它失去焦点后立即杀死应用程序。现在,如果发生这种情况,这种情况应该如何处理?有什么我可以做的来解决这个问题吗?我愿意评估甚至变通解决方案,使应用程序进入一个稳定和可靠的情况。
话虽如此,感谢您的时间!

nkoocmlb

nkoocmlb1#

感谢CommonsWare和 Alexandria 霍夫曼的评论,我最终解决了这个问题,利用了Android框架和Compose已经为我们提供的在系统启动的进程死亡过程中处理和持久化状态的方法:

  • rememberSaveable用于在可组合组件中持久化数据;
  • ViewModel中的SavedStateHandle用于持久化StateFlows;我发现这特别有用,并最终允许我完全解决这个问题,使我的应用程序处于非常稳定和可靠的状态。

This是我衷心推荐的developer.android上一个非常有用的页面,它描述了我们在谈论保存UI状态时的各种可能性。
话虽如此,我希望这将是有用的,并再次感谢大家的时间!

相关问题