【问题标题】:Camera access error on some android devices某些安卓设备上的相机访问错误
【发布时间】:2016-06-15 14:10:22
【问题描述】:

我编写了一个使用手机摄像头的应用程序。 在我尝试过的大多数设备上,它都运行良好,但有些应用程序在打开时崩溃了。 稍微调试了一下,发现尝试访问摄像头时出现问题。

完整的错误信息:

06-14 23:15:01.550 21872-21872/bguproject.vlc E/AndroidRuntime: FATAL EXCEPTION: main
Process: bguproject.vlc, PID: 21872
java.lang.RuntimeException: Unable to start activity ComponentInfo{bguproject.vlc/bguproject.vlc.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference
at bguproject.vlc.MainActivity.onCreate(MainActivity.java:54)
at android.app.Activity.performCreate(Activity.java:6272)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 
at android.app.ActivityThread.access$900(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5525) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

如您所见,错误提示我尝试在空对象引用上调用虚拟方法,如果 mCamera 的写入正确完成,则不会发生这种情况

代码(写在最后的try-catch短语上):

package bguproject.vlc;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ScrollView;


public class MainActivity extends Activity implements View.OnClickListener{
    private Camera mCamera = null;
    private CameraView mCameraView = null;
    private int fpsRate[] = new int[2];
    private  boolean work = true,receiving = false;
    private boolean send = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Logger l = Logger.getInstance(this); //create the logger instance

        Logger.Log("Starting VLC app...");

        try{
            bguproject.vlc.Logger.Log("\tAccessing camera...");
            mCamera = Camera.open();//you can use open(int) to use different cameras
        } catch (Exception e){
            bguproject.vlc.Logger.LogError("\tFailed to get camera: " + e.getMessage());
        }

完整代码: http://pastebin.com/hxqJK3t2

所有被压碎的手机都有一个可以工作的相机并且相对较新(三星 s6、三星 s7 和 LG g4)。

【问题讨论】:

  • 崩溃的手机是运行 Android Marshmallow 的吗?

标签: android


【解决方案1】:

三星 S6 和 LG G4 都可以升级到 Android Marshmallow(v6 或 API 23),三星 S7 正在库存 ROM 上运行 Marshmallow,所以我假设所有 3 台设备都在运行 Marshmallow :)

来自https://developer.android.com/training/permissions/requesting.html
注意:从 Android 6.0(API 级别 23)开始,用户可以随时撤消任何应用的权限,即使该应用的目标 API 级别较低。您应该测试您的应用程序,以验证它在缺少所需权限时是否正常运行,无论您的应用程序面向哪个 API 级别。

除了清单中设置的权限外,您还需要在运行时请求/检查权限。里面有你可以使用的示例代码,或者......


快速解决方案,

进入设置->应用->(您​​的应用名称)->权限并启用相机权限。 完成,但不推荐用于最终产品

然后再次尝试您的应用。现在应该可以工作了:D

【讨论】:

  • 就是这样,非常感谢。我实现了一个权限请求,但现在我得到了一个“setParameters failed”错误,尽管我授予了权限并且相机被访问了。有什么想法吗?完全错误 - pastebin.com/F2FGMrri
  • 看你的代码,我相信问题出在p.setPreviewFpsRange(14000, 14000); ,你可以在linklink看到解决方案,看来你将不得不调用.getSupportedPreviewFpsRange(); 和使用支持的范围而不是提供任意值:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多