Fragment 调用系统相机闪退问题

调用系统相机是很常见的功能点了,基本所有需要上传头像的应用都会有这个功能,而现在基本所有应用都有头像,所以。。。

不过也会遇到很多坑,例如在fragment中 不走onActivityResult方法。

解决办法就是在fragment 所在的Activity中重写onActivityResult方法 ,如下:

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        personFragment.onActivityResult(requestCode, resultCode, data);

其中 super方法必须包含

然后就是调用fragment的onActivityResult方法。

这个问题比较好处理,不过还会遇到一个问题例如:

data ==null

现在同行的方法就是 调用系统相机时,把照片保存在一个固态

private String fileName;
public final File FILE_SDCARD = Environment
        .getExternalStorageDirectory();
public final File FILE_LOCAL = new File(FILE_SDCARD, "vCar");
public final File FILE_PIC_SCREENSHOT = new File(FILE_LOCAL,
        "images/screenshots");

/**
 * 相机选择
 */
private void selectCamera() {
    fileName = String.valueOf((new Date()).getTime()) + ".jpg";
    SPUtil.getInstance().putString(Constant.FILE_PATH,fileName);
    File filePath = FILE_PIC_SCREENSHOT;
    if (!filePath.exists()) {
        filePath.mkdirs();
    }
    try {
        Intent intent = new Intent(
                MediaStore.ACTION_IMAGE_CAPTURE);
        File f = new File(filePath, fileName);
        // localTempImgDir和localTempImageFileName是自己定义的名字
        Uri u = Uri.fromFile(f);
        intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
        startActivityForResult(intent, TAKE_PICTURE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

不要以为这样就可以了 ,第三个坑来袭。

就是在这种情况下 你获取照片的方法如下:

File f = new File(FILE_PIC_SCREENSHOT, fileName);
Intent intent = new Intent(getActivity(), ActivityCropper.class);
intent.putExtra("path", f.getAbsolutePath());

// intent.putExtra("name", select_Num);
startActivityForResult(intent, CROP_PICTURE);
这时候在有些手机上还会报错,例如

filename ==null

原因可能是在fragment 调用相机并且返回后,fileName 没有保存

所以我的方法是保存在本地并且从本地读取。

存:

SPUtil.getInstance().putString(Constant.FILE_PATH,"")


读取:

SPUtil.getInstance().getString(Constant.FILE_PATH,"")
这样就不会报错并且能够顺利拿到图片了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 CameraX 调用系统相机需要使用以下步骤: 1. 在 build.gradle 文件中添加以下依赖项: ```groovy dependencies { def camerax_version = "1.0.0-beta06" implementation "androidx.camera:camera-camera2:$camerax_version" implementation "androidx.camera:camera-lifecycle:$camerax_version" implementation "androidx.camera:camera-view:1.0.0-alpha20" } ``` 2. 在布局文件中添加 CameraView: ```xml <androidx.camera.view.CameraView android:id="@+id/camera_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在 Activity 或 Fragment 中实例化 CameraX: ```kotlin class MainActivity : AppCompatActivity() { private lateinit var cameraView: CameraView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) cameraView = findViewById(R.id.camera_view) startCamera() } private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() val preview = Preview.Builder().build().also { it.setSurfaceProvider(cameraView.surfaceProvider) } val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle(this, cameraSelector, preview) } catch (e: Exception) { Log.e(TAG, "Use case binding failed", e) } }, ContextCompat.getMainExecutor(this)) } companion object { private const val TAG = "MainActivity" } } ``` 这样就可以使用 CameraX 调用系统相机了。注意,在 AndroidManifest.xml 文件中要添加相机权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 另外,CameraX 还提供了其他功能,比如拍照、录视频等,可以根据需要进行配置和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值