1

Я использовал мой Fabric -сервис и нашел эту ошибку на большинстве устройств, на которых запущено мое приложение ,Камера для Android: попытка вызвать виртуальный метод Параметры камеры для Android на android.hardware.Camera.getParameters() на ссылке с нулевым объектом

Ошибка заключалась в следующем:

Fatal Exception: попытка java.lang.NullPointerException вызвать виртуальный метод 'android.hardware.Camera $ Параметры android.hardware.Camera.getParameters()' на нуль ссылка

Здесь объект мой код:

public class CameraActivity extends Activity implements SurfaceHolder.Callback{ 

    android.hardware.Camera camera; 
    int moi = 0; 
    @InjectView(R.id.s) 
    SurfaceView surfaceView; 

    @InjectView(R.id.takeaphoto) 
    ImageView imageView; 
    SurfaceHolder surfaceHolder; 
    private Camera.Face[] mFaces; 





    // Draw rectangles and other fancy stuff: 
    private FaceOverlayView mFaceView; 
    private int mOrientation; 
    private float x1,x2; 
    static final int MIN_DISTANCE = 150; 
    private int mOrientationCompensation; 
    private OrientationEventListener mOrientationEventListener; 

    // Let's keep track of the display rotation and orientation also: 
    private int mDisplayRotation; 
    private int mDisplayOrientation; 


    Camera.PictureCallback callback; 
    int cameraId = 0; 
    Camera.ShutterCallback shutterCallback; 

    private Camera.FaceDetectionListener faceDetectionListener = new Camera.FaceDetectionListener() { 
     @Override 
     public void onFaceDetection(Camera.Face[] faces, Camera camera) { 
      Log.d("onFaceDetection", "Number of Faces:" + faces.length); 
      // Update the view now! 
      mFaceView.setFaces(faces); 
     } 

    }; 



    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     Fabric.with(this, new Crashlytics()); 
     Fabric.with(this, new Answers()); 
     setContentView(R.layout.camera_activity); 

     mFaceView = new FaceOverlayView(this); 
     addContentView(mFaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     // Create and Start the OrientationListener: 
     mOrientationEventListener = new SimpleOrientationEventListener(this); 
     mOrientationEventListener.enable(); 


     SharedPreferences pap = this.getSharedPreferences(
       "AD1", Context.MODE_PRIVATE); 
     boolean frr = pap.getBoolean("fr", false); 

     if (!frr) { 

      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Tip"); 
      builder.setMessage("Use the beautiful filters by swiping from right to left") 
        .setCancelable(true) 
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          SharedPreferences e = getApplicationContext().getSharedPreferences(
            "AD1", Context.MODE_PRIVATE); 
          SharedPreferences.Editor d = e.edit(); 
          d.putBoolean("fr", true); 
          d.commit(); 

         } 

        }); 


      AlertDialog alert = builder.create(); 
      alert.show(); 


     } else { 


     } 



     ButterKnife.inject(this); 
     surfaceHolder=surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
cameraImage(); 
      } 
     }); 
     callback = new android.hardware.Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] bytes, android.hardware.Camera camera) { 
       FileOutputStream outputStream=null; 
       File file_image = getDirc(); 

       SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyymmddhhmms"); 
       String date = simpleDateFormat.format(new Date()); 
       String photo_file="PI_"+date+".jpg"; 
       String file_name = file_image.getAbsolutePath()+"/"+photo_file; 
       File picfile=new File(file_name); 

       try { 

        outputStream=new FileOutputStream(picfile); 
        outputStream.write(bytes); 
        outputStream.close(); 


       }catch (FileNotFoundException e){} 
       catch (IOException ex){} 
       finally { 

       } 
       refreshCamera(); 
       refreshGallery(picfile); 

       try { 
        camera.stopPreview(); 
       }catch (Exception e){} 

       try{ 

        camera.setPreviewDisplay(surfaceHolder); 
        camera.startPreview(); 
       }catch (Exception e){} 


      } 


     }; 


     } 








    private void refreshGallery(File file){ 
     Intent intent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     intent.setData(Uri.fromFile(file)); 



    } 

    public void refreshCamera(){ 

     if (surfaceHolder.getSurface() == null){ 

      return; 

     } 

    } 


    private class SimpleOrientationEventListener extends OrientationEventListener { 

     public SimpleOrientationEventListener(Context context) { 
      super(context, SensorManager.SENSOR_DELAY_NORMAL); 
     } 

     @Override 
     public void onOrientationChanged(int i) { 
      // We keep the last known orientation. So if the user first orient 
      // the camera then point the camera to floor or sky, we still have 
      // the correct orientation. 
      if (orientation == ORIENTATION_UNKNOWN) return; 
      mOrientation = Util.roundOrientation(orientation, mOrientation); 
      // When the screen is unlocked, display rotation may change. Always 
      // calculate the up-to-date orientationCompensation. 
      int orientationCompensation = mOrientation 
        + Util.getDisplayRotation(CameraActivity.this); 
      if (mOrientationCompensation != orientationCompensation) { 
       mOrientationCompensation = orientationCompensation; 
       mFaceView.setOrientation(mOrientationCompensation); 
      } 
     } 

    } 


     private File getDirc(){ 

File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
     return new File(dics ,"Camera"); 

    } 

    public void cameraImage(){ 

     camera.takePicture(null , null ,callback); 
     MediaPlayer mediaPlayer = MediaPlayer.create(this , R.raw.sound); 
     mediaPlayer.start(); 

    } 


    public void surfaceCreated(SurfaceHolder surfaceHolder) { 



try { 
    camera = android.hardware.Camera.open(); 
}catch (RuntimeException ex){} 
     android.hardware.Camera.Parameters parameters; 
     parameters = camera.getParameters(); 
     camera.setFaceDetectionListener(faceDetectionListener); 
     camera.startFaceDetection(); 
     parameters.setPreviewFrameRate(20); 
     List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes(); 
     Camera.Size customSize = customSizes.get(0); //Added size 
     parameters.setPreviewSize(customSize.width, customSize.height); 
       parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     camera.setParameters(parameters); 
     camera.setDisplayOrientation(90); 


     try { 

      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 


     }catch (Exception e){ 



     } 

    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
     refreshCamera(); 
     setDisplayOrientation(); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera=null; 

    } 

    public void frontCamera(View view) { 

     camera.stopPreview(); 
     camera.release(); 
     camera=null; 

     if (cameraId == 0){ 


      try { 
       camera = android.hardware.Camera.open(1); 
      }catch (RuntimeException ex){} 
      android.hardware.Camera.Parameters parameters; 
      camera.setFaceDetectionListener(faceDetectionListener); 
      camera.startFaceDetection(); 
      parameters = camera.getParameters(); 
      parameters.setPreviewFrameRate(20); 
      List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes(); 


      Camera.Size customSize = customSizes.get(0); //Added size 
      parameters.setPreviewSize(customSize.width, customSize.height); 
      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
      camera.setParameters(parameters); 
      camera.setDisplayOrientation(90); 

      cameraId = 1; 


      try { 

       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 


      }catch (Exception e){ 



      } 
     } 

     else{ 

      try { 
       camera = android.hardware.Camera.open(); 
      }catch (RuntimeException ex){} 
      android.hardware.Camera.Parameters parameters; 
      camera.setFaceDetectionListener(faceDetectionListener); 
      camera.startFaceDetection(); 
      parameters = camera.getParameters(); 
      parameters.setPreviewFrameRate(20); 
      List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes(); 


      Camera.Size customSize = customSizes.get(0); //Added size 
      parameters.setPreviewSize(customSize.width, customSize.height); 
      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
      camera.setParameters(parameters); 
      camera.setDisplayOrientation(90); 

      cameraId = 0; 

      try { 

       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 


      }catch (Exception e){ 



      } 

     } 
     } 

    private void setDisplayOrientation() { 
     // Now set the display orientation: 
     mDisplayRotation = Util.getDisplayRotation(CameraActivity.this); 
     mDisplayOrientation = Util.getDisplayOrientation(mDisplayRotation, 0); 

     camera.setDisplayOrientation(mDisplayOrientation); 

     if (mFaceView != null) { 
      mFaceView.setDisplayOrientation(mDisplayOrientation); 
     } 
    } 

Вот мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="example.camera"> 

    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/pc" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".SplashScreen" 
      android:theme="@style/AppTheme" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".CameraActivity" 
     android:screenOrientation="portrait" 
     > 
     </activity> 
     <meta-data 
      android:name="io.fabric.ApiKey" 
      android:value="e7ded6b46068e619fd1d96f6b9eeaac888fe83f5" /> 
    </application> 

    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 
+3

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – Selvin

+1

'try { camera = android.hardware.Camera.open(); } catch (RuntimeException ex) {} parameters = camera.getParameters(); 'серьезно? ... если 'open()' терпит неудачу, то, очевидно, 'camera' будет null – Selvin

ответ

0

Вот ваша проблема. Ваш объект camera создается только в том случае, если нет RuntimeException. Итак, если это исключение происходит, camera == null;.

try { 
    camera = android.hardware.Camera.open(); 
}catch (RuntimeException ex){} 
// Here is your problem. Catching RuntimeException will make camera object null, 
// so method 'getParameters();' won't work :) 
     android.hardware.Camera.Parameters parameters; 
     parameters = camera.getParameters(); 
     camera.setFaceDetectionListener(faceDetectionListener); 
     camera.startFaceDetection(); 
     parameters.setPreviewFrameRate(20); 
     List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes(); 
     Camera.Size customSize = customSizes.get(0); //Added size 
     parameters.setPreviewSize(customSize.width, customSize.height); 
       parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     camera.setParameters(parameters); 
     camera.setDisplayOrientation(90); 


     try { 

      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 


     }catch (Exception e){ 



     } 

    } 
+0

Это правда, я не заметил thzt раньше, но он по-прежнему получает ту же ошибку после удаления' try() 'и' catch' ; – User

4

Проверьте приложение в устройстве Settings, если требуемые разрешения даются или нет. В моем случае это было причиной Exception, что я не дал разрешения от Settings.

Надеюсь, это поможет вам.

 Смежные вопросы

  • Нет связанных вопросов^_^