某些Android设备上的相机访问错误



我编写了一个应用程序相机的应用程序。在大多数设备上,我尝试过它运行良好,但是在打开时,应用程序崩溃了。一点点调试表明,试图访问相机时存在问题。

完整错误消息:

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) 

您可以看到错误说我尝试在null对象引用上调用虚拟方法,如果正确完成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)。

三星S6和LG G4都可以升级到Android Marshmallow(V6或API 23),Samsung S7都在股票ROM上运行棉花糖,所以我假设所有3个设备都在运行棉花糖,:)

来自https://developer.android.com/training/permissions/requesting.html
注意:从Android 6.0开始(API级别23),即使应用程序针对较低的API级别,用户也可以随时撤销任何应用程序的权限。您应该测试您的应用程序,以验证当缺少所需许可的情况下,无论您的应用程序目标如何,它的行为是否正常。

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


快速解决方案,

转到设置 ->应用程序 ->(您的应用程序名称) ->权限并启用相机许可。 完成,尽管不建议最终产品

然后再次尝试您的应用程序。现在应该工作:D

最新更新