cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis);
这一行代码中触发的 。而这个配置是在try/cathc包裹中 。我们只需要主动捕获一下IllegalArgumentException 异常就可以避免崩溃了 。
【Android中各种Exception错误小结】try {...cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis);catch (IllegalArgumentExceptione) {e.printStackTrace(); catch (Exception e) {e.printStackTrace();}
但是 , 这样不够优美 。最好的方法就是在需要启动相机相关界面时 , 检测一下设备是否存在摄像头 。效果会更好一些 。
检测方法比较简单
boolean isBack = cameraProvider.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA);//检测默认后置摄像头boolean isFront = cameraProvider.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA); //检测默认前置摄像头
可以通过这两个方法检测设备是否存在默认摄像头 , 但是如果是通过USB , 蓝牙等方式动态添加的摄像头 。上面两种方法可不会检测到 。
我们可以通过获取CameraInfo列表来判断是否有相机:
List<CameraInfo> camerList = provider.getAvailableCameraInfos();//得到相机列表//然后根据设备信息列表 , 得到硬件等级最高的相机if (camerList == null || camerList.size() == 0) {return null; //没有摄像头}
问题3:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx/com.xxx.xxx.activity.xx.xx}: java.lang.IllegalArgumentException: LayoutManager androidx.recyclerview.widget.LinearLayoutManager@ed46d74 is already attached to a RecyclerView: androidx.recyclerview.widget.RecyclerView{584229d VFED..... ......I. 0,0-0,0 #7f0901a0 app:id/recyclerClass}, adapter:com.xxx.xx.xx.xxx@e3cc312, layout:androidx.recyclerview.widget.LinearLayoutManager@ed46d74, context:com.xxx.xx.xx.xxx.xxx@19aeae4at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3298)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3437)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2041)at android.os.Handler.dispatchMessage(Handler.java:107)at android.os.Looper.loop(Looper.java:214)at android.app.ActivityThread.main(ActivityThread.java:7386)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
解决:
当我们在同一个界面中多个RecyclerView? 使用同一个LinearLayoutManager?或者GridLayoutManager的时候就会触发上面的运行时错误了 。程序就会崩溃
错误写法:
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,RecyclerView.VERTICAL,false);viewBinding.recyclerClass.setLayoutManager(linearLayoutManager);viewBinding.recyclerGrop.setLayoutManager(linearLayoutManager);
在上面 , 两个recyclerView? 使用了同一个LinearLayoutManager 。就会触发崩溃了 。
正确写法为:
viewBinding.recyclerClass.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,false));viewBinding.recyclerGrop.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,false));
推荐阅读
- 线程池中线程抛了异常,该如何处理?
- 前端js中http跳转https报403错误,请求头referer详解
- 2月10日起境外中国公民换领驾照可“委托办”
- 招聘网站哪个比较好,中国十大招聘网站
- 钓鱼|天选打工人不少,天选钓鱼人更多,其中原因你知道吗?
- 狂飙|《狂飙》中藏了4位星二代,王骁没让人失望,吴刚儿子演技最拉胯
- 红色警戒地图包怎么导入__下载的红警地图包怎么导入游戏中
- 农业银行信用卡中心申请进度查询!农行信用卡中心电话?
- 国湘资本官网登录!谁知道《中国通史》纪录片在哪里能下到?要比较全一点的?
- 雷霆沙赞!众神之怒|DC新片《雷霆沙赞!众神之怒》中国内地定档 将于3月17日上映