2017-09-02 137 views
1

我是Android编程的新手。我需要用OpenCV库打开相机,我已经按照this视频教程。致命异常:main java.lang.RuntimeException

但是,应用程序在运行时已停止在模拟器上,只能查看“app_name已停止尝试再次打开”的消息。有很多错误,我修复了其中的很多错误,但我无法修复其他错误。这是我的logcat:

09-02 04:00:52.628 9058-9058/samaa.example.com.opencv249 E/AndroidRuntime: FATAL EXCEPTION: main Process: samaa.example.com.opencv249, PID: 9058 
java.lang.RuntimeException: Unable to start activity ComponentInfo{samaa.example.com.opencv249/samaa.example.com.opencv249.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
    at samaa.example.com.opencv249.MainActivity.onCreate(MainActivity.java:55) 
    at android.app.Activity.performCreate(Activity.java:6679) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6119)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

这里是我的主要Acivity:

package samaa.example.com.opencv249; 

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.SurfaceView; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.JavaCameraView; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { 

    private static String TAG="MainActivity"; 
    JavaCameraView javaCameraView; 
    Mat mRgba; 
    BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status){ 
       case BaseLoaderCallback.SUCCESS: { 
        javaCameraView.enableView(); 
        break; 
       } 
       default:{ 
        super.onManagerConnected(status); 
        break; 
       } 
      } 

     } 
    }; 
    static { 
     if (OpenCVLoader.initDebug()) { 
      Log.i(TAG, "successfull"); 
     } 
     else { 
      Log.i(TAG,"failed"); 
     } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

      setContentView(R.layout.activity_main); 
      javaCameraView = (javaCameraView).findViewById(R.id.java_camera_view); 
      javaCameraView.setVisibility(SurfaceView.VISIBLE); 
      javaCameraView.setCvCameraViewListener(this); 

    } 
    @Override 

    protected void onPause() 
    { 
     super.onPause(); 
     if(javaCameraView != null) 
      javaCameraView.disableView(); 
    } 

    @Override 

    protected void onDestroy() 
    { 
     super.onDestroy(); 
     if(javaCameraView != null) 
      javaCameraView.disableView(); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     javaCameraView.enableView(); 

     /* if (OpenCVLoader.initDebug()) { 
      Log.i(TAG, "successfull"); 
      mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
     else { 
      Log.i(TAG,"failed"); 
      OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mLoaderCallBack); 
     }*/ 


    } 

    @Override 
    public void onCameraViewStarted(int width, int height) { 
     mRgba= new Mat(height,width, CvType.CV_8UC4); 

    } 

    @Override 
    public void onCameraViewStopped() { 
     mRgba.release(); 

    } 

    @Override 
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
     mRgba= inputFrame.rgba(); 
     return mRgba; 
    } 

    private void requestRecordAudioPermission() { 
     //check API version, do nothing if API version < 23! 
     int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     if (currentapiVersion > android.os.Build.VERSION_CODES.LOLLIPOP){ 

      if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 

       // Should we show an explanation? 
       if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { 

        // Show an expanation to the user *asynchronously* -- don't block 
        // this thread waiting for the user's response! After the user 
        // sees the explanation, try again to request the permission. 

       } else { 

        // No explanation needed, we can request the permission. 

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1); 
       } 
      } 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case 1: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        // permission was granted, yay! Do the 
        // contacts-related task you need to do. 
        Log.d("Activity", "Granted!"); 

       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Log.d("Activity", "Denied!"); 
        finish(); 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
} 
+1

“尝试上的空对象引用调用虚拟方法android.view.View android.view.View.findViewById(int)的”'更少装置的NullPointerException。 [如何修复](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Mibac

回答

1

您正试图找到(javaCameraView).find来自未初始化观看基准哪里,你需要使用铸造所以使用

javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view); 
//Casting,class name ^^^^^^^^^ 
// notice no dot(.)  ^

,而下面的语句将试图找到ID为viewjava_camera_viewjavaCameraView对象,它是尚未被初始化

(javaCameraView).findViewById(R.id.java_camera_view); 
+0

我没有注意到^ _^thanx很多。 。但它仍然不工作与一个新的错误说:“错误:(55,31)错误:无法找到符号类javaCameraView” –

+0

在哪一行或它到处? –

+0

它到处都是“javaCameraView” –

相关问题