Android中各种Exception错误小结( 三 )


 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));



推荐阅读