onDestroy报空指针boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()‘ on a null object re...

本文解决了一个在特定Fragment中出现的NullPointerException问题,该错误发生在尝试销毁LoginActivity时。问题根源在于自定义的onDetach方法中的一段代码,该代码尝试将mChildFragmentManager设置为null。解决方案是移除这段代码,因为新版本的Fragment已不再需要此类操作。
java.lang.RuntimeException: Unable to destroy activity {com.leite.app.dayitem/com.leite.app.dayitem.view.user.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
2020-06-08 12:33:57.459 8909-8909/com.leite.app.dayitem W/System.err:     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4167)

原因:

是因为自己在Fragment重点onDetach增加了如下代码,自己把它设为了空值导致的,新版本的Fragment不会再产生这个问题,可以直接把这部分代码去掉。

  @Override
    public void onDetach() {//避免api bug :IllegalStateException No activity
        super.onDetach();
        try {
            Field childFragmentManager =             
            Fragment.class.getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

原文地址

<think>我们正在查找关于`com.android.ex.camera2.portability`的使用方法。根据提供的引用,我们可以得知: - 引用[1]提到`CameraAgentFactory`定义在`frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraAgentFactory.java`,并且`CameraController`实现了相机提供者接口,而`CameraAgent`通过`CameraAgentFactory`创建。 - 引用[2]提到CameraX是基于Camera2 API封装的,兼容Camera1,但这里并没有直接提到`com.android.ex.camera2.portability`。 - 引用[3]展示的是Android框架中`CameraManager.java`的部分源码,属于原生Camera2 API的代码,与`com.android.ex.camera2.portability`没有直接关系。 - 引用[4]展示的是相机模块中关于对焦的调用流程,其中提到了`AndroidCamera2AgentImpl$AndroidCamera2ProxyImpl.autoFocus`,这可能是`com.android.ex.camera2.portability`包中类的一部分。 重点分析引用[1]和引用[4]: 1. 引用[1]指出`CameraAgentFactory`用于创建`CameraAgent`,而`CameraAgent`是相机操作的代理,用于提供相机功能。 2. 引用[4]中的`AndroidCamera2AgentImpl`可能是`com.android.ex.camera2.portability`包中的一个类,用于实现相机代理的具体功能。 因此,我们可以推测使用`com.android.ex.camera2.portability`的基本步骤: 1. 通过`CameraAgentFactory`创建一个`CameraAgent`实例。 2. 使用`CameraAgent`打开相机,获取`CameraProxy`(相机代理)对象。 3. 通过`CameraProxy`进行相机操作(如设置参数、对焦、拍照等)。 下面我们尝试构建一个使用示例: ### 使用com.android.ex.camera2.portability的基本步骤 1. **获取CameraAgentFactory实例**: 首先,通过`CameraAgentFactory`的静态方法获取一个实例。通常,我们会指定一个Camera API的版本(如`CAMERA_API_TYPE_1`或`CAMERA_API_TYPE_2`)和上下文(Context)。 2. **创建CameraAgent**: 使用`CameraAgentFactory`创建一个`CameraAgent`对象。`CameraAgent`是一个接口,其实现类提供了对相机系统的访问。 3. **打开相机**: 调用`CameraAgent`的`openCamera`方法,传入相机ID和一个`CameraStateCallback`回调,用于处理相机状态变化(如打开成功、断开连接等)。在回调中,我们将获得一个`CameraProxy`对象。 4. **使用CameraProxy操作相机**: 通过`CameraProxy`对象,我们可以设置预览显示(例如设置`SurfaceHolder`)、设置参数、启动预览、进行对焦、拍照等操作。 5. **释放资源**: 使用完毕后,需要调用`CameraAgent`的`closeCamera`方法关闭相机。 ### 示例代码框架 以下是一个简化的代码框架,展示如何使用`com.android.ex.camera2.portability`: ```java import com.android.ex.camera2.portability.CameraAgent; import com.android.ex.camera2.portability.CameraAgentFactory; import com.android.ex.camera2.portability.CameraProxy; // ... // 获取CameraAgentFactory实例(通常使用单例) CameraAgentFactory cameraAgentFactory = CameraAgentFactory.getAndroidCameraAgentFactory( context, CameraAgentFactory.CameraApiVersion.CAMERA_API_TYPE_2); // 或 CAMERA_API_TYPE_1 // 创建CameraAgent CameraAgent cameraAgent = cameraAgentFactory.getCameraAgent(context); // 打开相机(例如后置摄像头,通常id=0) int cameraId = ...; // 相机ID,0通常是后置 cameraAgent.openCamera(new Handler(Looper.getMainLooper()), cameraId, new CameraAgent.CameraOpenCallback() { @Override public void onCameraOpened(CameraProxy camera) { // 相机打开成功,获得CameraProxy对象 mCameraProxy = camera; // 可以在这里进行相机配置和启动预览 // 例如:设置预览显示 mCameraProxy.setPreviewDisplay(surfaceHolder); // 设置参数 CameraSettings settings = mCameraProxy.getSettings(); // ... 修改设置 mCameraProxy.applySettings(settings); // 开始预览 mCameraProxy.startPreview(); } @Override public void onCameraDisabled(int cameraId) { // 相机被禁用 } @Override public void onDeviceOpenFailure(int cameraId, String info) { // 打开失败 } @Override public void onDeviceOpenedAlready(int cameraId, String info) { // 相机已经被打开 } @Override public void onReconnectionFailure(CameraAgent mgr, String info) { // 重新连接失败 } }); ``` 在对焦操作中,可以调用`autoFocus`方法(如引用[4]所示): ```java // 对焦 mCameraProxy.autoFocus(new CameraProxy.CameraAFCallback() { @Override public void onAutoFocus(boolean success, CameraProxy camera) { // 对焦结果处理 } }); ``` ### 注意事项 - 这个包`com.android.ex.camera2.portability`似乎并不是Android官方公开的API,而是AOSP(Android Open Source Project)中的代码。因此,在应用开发中直接使用可能并不常见,通常出现在系统应用或定制ROM中。 - 对于普通应用开发,建议使用官方的Camera2 API(android.hardware.camera2)或CameraX库(引用[2]中提到CameraX的兼容性优势),因为它们有更好的支持和维护。 ### 参考 [^1]: CameraProvider是Camera App内部定义的一个接口,定义相机提供者;也就是说CameraController实现了打开和关闭设备时的回调接口&相机提供者接口;传入其中的CameraAgent通过CameraAgentFactory创建;CameraAgentFactory定义在frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraAgentFactory.java; [^4]: 1,PhotoModule.onSingleTapUp ==》 2,FocusOverlayManager.onSingleTapUp ==》 3,FocusOverlayManager.autoFocus ==》 4, PhotoModule.autoFocus ==》 5,AndroidCamera2AgentImpl$AndroidCamera2ProxyImpl.autoFocus §§相关问题§§ 1. `com.android.ex.camera2.portability`和Android Camera2 API有什么区别? 2. 如何使用Android官方Camera2 API实现相机功能? 3.Android应用开发中,推荐使用CameraX还是直接使用Camera2 API? </think>要查找`com.android.ex.camera2.portability`的使用方法,需结合Android相机开发框架分析。以下是关键使用步骤和原理: ### 一、核心接口与类 1. **`CameraAgentFactory`** 入口类,用于创建相机实例: ```java CameraAgent cameraAgent = CameraAgentFactory.getAndroidCameraAgentFactory( context, CameraAgentFactory.CameraApiVersion.CAMERA_API_TYPE_2 ); ``` 2. **`CameraAgent`** 相机操作代理接口,提供基础功能: ```java cameraAgent.openCamera(handler, cameraId, new CameraAgent.CameraOpenCallback() { @Override public void onCameraOpened(CameraProxy camera) { // 获取CameraProxy实例 } }); ``` 3. **`CameraProxy`** 相机控制核心接口(通过`CameraAgent.openCamera()`获取): ```java // 设置参数 CameraSettings settings = camera.getSettings(); settings.setFlashMode(CameraSettings.FLASH_MODE_AUTO); camera.applySettings(settings); // 启动预览 camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); // 自动对焦(如引用[4]流程) camera.autoFocus(new CameraProxy.CameraAFCallback() { @Override public void onAutoFocus(boolean success, CameraProxy camera) { // 对焦结果处理 } }); ``` ### 二、完整使用流程 ```java // 1. 初始化 CameraAgent cameraAgent = CameraAgentFactory.getAndroidCameraAgentFactory( context, CameraAgentFactory.CameraApiVersion.CAMERA_API_TYPE_2 ); // 2. 打开相机 cameraAgent.openCamera(handler, 0, new CameraAgent.CameraOpenCallback() { @Override public void onCameraOpened(final CameraProxy camera) { // 3. 配置参数 CameraSettings settings = camera.getSettings(); settings.setPictureSize(1920, 1080); settings.setFocusMode(CameraSettings.FOCUS_MODE_CONTINUOUS_PICTURE); camera.applySettings(settings); // 4. 设置预览 camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); // 5. 拍照捕获 camera.takePicture(null, null, new CameraProxy.CameraPictureCallback() { @Override public void onPictureTaken(byte[] data, CameraProxy camera) { // 处理图像数据 } }); } }); // 6. 释放资源(Activity/Fragment销毁时) @Override protected void onDestroy() { cameraAgent.closeCamera(); super.onDestroy(); } ``` ### 三、关键注意事项 1. **线程管理** 使用`Handler`传递回调事件到主线程,避免阻塞相机硬件线程[^3]。 2. **生命周期绑定** 需在`onResume()`中打开相机,在`onPause()`中关闭,防止资源泄露。 3. **兼容性设计** 该包通过`CameraProxy`抽象层兼容不同API版本: - 内部自动判断使用Camera1或Camera2 API(如引用[3]中的`supportsCamera2ApiLocked`检测)[^2][^3] 4. **错误处理** 实现`CameraOpenCallback`的所有回调方法: ```java onDeviceOpenFailure(int cameraId, String info) // 设备打开失败 onReconnectionFailure(CameraAgent mgr, String info) // 重连失败 ``` ### 四、典型应用场景 1. **系统相机App** 如引用[4]所示的`PhotoModule`对焦流程,通过`AndroidCamera2AgentImpl`代理操作硬件[^4]。 2. **自定义相机开发** 封装`CameraProxy`实现高级功能(如HDR连拍、手动曝光)。 --- [^1]: `CameraAgentFactory`创建相机代理实例,是操作入口 [^2]: 兼容层自动处理Camera1/Camera2 API差异 [^3]: 底层通过`CameraManager`同步访问硬件 [^4]: 对焦等操作通过代理接口实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值