android销毁camera,Android:调用Camera Intent之后,活动正在销毁

Android:调用Camera Intent之后,活动正在销毁

我有两个活动(A1,A2)。 A1打电话给A2,从A2我打电话给下面的照相机意图

launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath); startActivityForResult(launchIntent,CAMERA_REQUEST);

它打开相机,我可以拍照。 但是,一旦我点击保存button(在S3中的勾号button)出现问题,我的onActivityResult不被调用,而是A2的onDestroy方法被调用。 我在onActivityResult fn中有几个逻辑要做。

我已经阅读了一些post在Stackoverflow这一点,但我不能得到有用的输出。我有我的清单像这样我的第二个活动(A2)

android:configChanges="keyboardHidden|orientation|locale" android:screenOrientation="portrait

注意:在HTC One X中,我的onActivityResult fn被调用,但是在S3中,第二个Activity(A2)正在被销毁

Plz分享你对此的想法。 提前致谢

我有同样的问题。我会疯了,但最后我在这里find了解决办法。 问题是,当你点击照相机的“保存”button时,活动调用改变方向的方法,它会破坏和重新创build。 尝试设置

android:configChanges="orientation|screenSize"

在Android清单(不仅android:configChanges="orientation"因为在这里build议,它不适用于API级别13或更高)。

它防止摧毁活动,它为我工作。

启动相机需要大量的内存。 所以在内存不足的设备上,android系统closures在后台运行的Activity,因此调用onCreate()。 由于你给这个photopath成为null,你将无法得到保存的图像。

解决scheme是保存photopath而系统正在摧毁你的活动,然后再恢复。

@Override public void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub outState.putString("photopath", photopath); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub if (savedInstanceState != null) { if (savedInstanceState.containsKey("photopath")) { photopath = savedInstanceState.getString("photopath"); } } super.onRestoreInstanceState(savedInstanceState); }

如果你正在做这个片段。

@Override public void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub outState.putString("photopath", photopath)); super.onSaveInstanceState(outState); } @Override public void onViewStateRestored(Bundle savedInstanceState) { // TODO Auto-generated method stub if (savedInstanceState != null) { if (savedInstanceState.containsKey("photopath")) { photopath = savedInstanceState.getString("photopath"); } } super.onViewStateRestored(savedInstanceState); }

确保你没有“不要保留活动”的开发者设置,因为它会破坏你要离开的活动。

相机应用程序需要大量的内存和释放内存,操作系统必须杀死后台应用程序,包括你的。 这对所有Android应用程序都是正常的。 当相机应用程序返回时,您的活动将被重新创build。 要保留活动状态信息,请覆盖onSaveInstanceState()来存储数据并将其读回到onCreate() 。

我的活动有很多任务运行时,我打电话相机意图..我有GPS位置监听,和更多的任务。

当它从相机意图返回时,我需要在图像的拍摄位置上的地图上添加标记。因此,如果用户拍摄了多张照片,则应该为每张照片显示标记。

如果每当我打电话给Camera Intent的时候它会破坏我的Activity,我之前关于标记和它们的位置的所有信息都将丢失。而且,我将不得不重新初始化地图。 这是我的应用程序的一个大问题。

是的,只有在风景模式下拍照时才会发生。 如果我用肖像拍照,一切都很好。

我会尝试使用android:configChanges="orientation|screenSize"正如这里所build议的..希望它会帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 CameraX 调用系统相机,需要以下步骤: 1. 添加 CameraX 依赖项,可以在项目的 build.gradle 文件中添加以下代码: ``` dependencies { def camerax_version = "1.0.0-beta06" implementation "androidx.camera:camera-core:$camerax_version" implementation "androidx.camera:camera-camera2:$camerax_version" } ``` 2. 在布局文件中添加一个按钮: ``` <Button android:id="@+id/btn_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Open Camera" /> ``` 3. 在 Activity 或 Fragment 中添加以下代码: ``` private val REQUEST_CODE_CAMERA_PERMISSION = 1001 private lateinit var imageCapture: ImageCapture override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 检查相机权限 if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CODE_CAMERA_PERMISSION) } // 初始化 ImageCapture val imageCaptureConfig = ImageCaptureConfig.Builder().apply { setTargetRotation(windowManager.defaultDisplay.rotation) }.build() imageCapture = ImageCapture(imageCaptureConfig) // 点击按钮调用相机 btn_camera.setOnClickListener { val outputDirectory = getOutputDirectory() val photoFile = File(outputDirectory, SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg") val options = ImageCapture.OutputFileOptions.Builder(photoFile).build() imageCapture.takePicture(options, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback { override fun onError(error: ImageCaptureException) { Log.e(TAG, "Photo capture failed: ${error.message}", error) } override fun onImageSaved(output: ImageCapture.OutputFileResults) { val savedUri = output.savedUri ?: Uri.fromFile(photoFile) val intent = Intent(Intent.ACTION_VIEW, savedUri) startActivity(intent) } }) } } // 获取输出目录 private fun getOutputDirectory(): File { val mediaDir = externalMediaDirs.firstOrNull()?.let { File(it, resources.getString(R.string.app_name)).apply { mkdirs() } } return if (mediaDir != null && mediaDir.exists()) mediaDir else filesDir } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_CAMERA_PERMISSION && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 授权成功 } } ``` 在这段代码中,我们首先检查相机权限,然后初始化 `ImageCapture` 对象。当用户点击按钮时,我们使用 `ImageCapture` 对象拍摄照片,并将其保存到设备上。最后,我们使用 `Intent` 打开保存的照片。 需要注意的是,这里我们使用了 `androidx.camera:camera-camera2` 依赖项,因为它提供了更低级别的访问相机 API,可以更好地控制相机的行为。如果你想要更高级别的相机 API,可以尝试使用 `androidx.camera:camera-lifecycle` 依赖项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值