2016-05-04 8 views
0

ich zur Zeit auf einer App arbeiten, wo es ein Fragment ist, die eine Vorschau einer Kamera (API 2), Art der Homepage Kamera Snapchat. Ich habe überall nach der Lösung gesucht, ohne Glück. Deshalb frage ich heute hier. Hier ist mein Code-Beispiel:Kamera-API 2 Vorschau in Fragmente android

import android.Manifest; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.graphics.SurfaceTexture; 
import android.hardware.camera2.CameraAccessException; 
import android.hardware.camera2.CameraCaptureSession; 
import android.hardware.camera2.CameraCharacteristics; 
import android.hardware.camera2.CameraDevice; 
import android.hardware.camera2.CameraManager; 
import android.hardware.camera2.CaptureRequest; 
import android.hardware.camera2.params.StreamConfigurationMap; 
import android.os.Build; 
import android.os.Handler; 
import android.os.HandlerThread; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.util.Size; 
import android.util.SparseIntArray; 
import android.view.LayoutInflater; 
import android.view.Surface; 
import android.view.TextureView; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class CameraFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     mTextureView = (TextureView) getView().findViewById(R.id.textureView); 

     View rootView = inflater.inflate(R.layout.fragment_camera, container, false); 
     return rootView; 
    } 

    private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0; 

    private TextureView mTextureView; 
    private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() { 
     @Override 
     public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
      setupCamera(width, height); 
      connectCamera(); 
     } 

     @Override 
     public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 

     } 

     @Override 
     public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
      return false; 
     } 

     @Override 
     public void onSurfaceTextureUpdated(SurfaceTexture surface) { 

     } 
    }; 

    private CameraDevice mCameraDevice; 
    private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(CameraDevice camera) { 
      mCameraDevice = camera; 
      startPreview(); 
      //Toast.makeText(getApplicationContext(), "Camera connected!", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onDisconnected(CameraDevice camera) { 
      camera.close(); 
      mCameraDevice = null; 
     } 

     @Override 
     public void onError(CameraDevice camera, int error) { 
      camera.close(); 
      mCameraDevice = null; 
     } 
    }; 

    private CaptureRequest.Builder mCaptureRequestBuilder; 

    private static SparseIntArray ORIENTATIONS = new SparseIntArray(); 
    static { 
     ORIENTATIONS.append(Surface.ROTATION_0, 0); 
     ORIENTATIONS.append(Surface.ROTATION_90, 90); 
     ORIENTATIONS.append(Surface.ROTATION_180, 180); 
     ORIENTATIONS.append(Surface.ROTATION_270, 270); 
    } 

    private static class CompareSizeByArea implements Comparator<Size> { 

     @Override 
     public int compare(Size lhs, Size rhs){ 
      return Long.signum((long) lhs.getWidth() * lhs.getHeight()/
        (long) rhs.getWidth() * rhs.getHeight()); 
     } 
    } 

    private static int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation){ 
     int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
     deviceOrientation = ORIENTATIONS.get(deviceOrientation); 
     return(sensorOrientation + deviceOrientation + 360) % 360; 
    } 

    @Override 
    public void onPause() { 
     closeCamera(); 

     stopBackgroundThread(); 

     super.onPause(); 
    } 

    private void closeCamera() { 
     if(mCameraDevice != null) { 
      mCameraDevice.close(); 
      mCameraDevice = null; 
     } 
    } 

    private HandlerThread mBackgroundHandlerThread; 
    private Handler mBackgroundHandler; 

    private String mCameraId; 

    private Size mPreviewSize; 

    @Override 
    public void onResume() { 
     super.onResume(); 

     startBackgroundThread(); 

     if(mTextureView.isAvailable()) { 
      setupCamera(mTextureView.getWidth(), mTextureView.getHeight()); 
      connectCamera(); 
     } else { 
      mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); 
     } 
    } 

    public void onWindowFocusChanged (boolean hasFocus) { 
     super.getActivity().onWindowFocusChanged(hasFocus); 
     View decorView = getActivity().getWindow().getDecorView(); 
     if(hasFocus){ 
      decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
        | View.SYSTEM_UI_FLAG_FULLSCREEN 
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 
     } 
    } 

    private void setupCamera(int width, int height) { 
     CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     try { 
      for (String cameraId : cameraManager.getCameraIdList()) { 
       CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); 
       if(cameraCharacteristics.get(cameraCharacteristics.LENS_FACING) == 
         CameraCharacteristics.LENS_FACING_FRONT){ 
        continue; 
       } 
       StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
       int deviceOrientation = getActivity().getWindowManager().getDefaultDisplay().getRotation(); 
       int totalRotation = sensorToDeviceRotation(cameraCharacteristics, deviceOrientation); 
       boolean swapRotation = totalRotation == 90 || totalRotation == 270; 
       int rotatedWidth = width; 
       int rotatedHeight = height; 
       if (swapRotation){ 
        rotatedWidth = height; 
        rotatedHeight = width; 
       } 
       mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight); 
       mCameraId = cameraId; 
       return; 
      } 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void connectCamera() { 
     CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     try { 
      if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { 
       if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == 
         PackageManager.PERMISSION_GRANTED) { 
        cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler); 
       } else { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { 
        Toast.makeText(getActivity(), "This app requires access to camera", Toast.LENGTH_LONG).show(); 
       } 
       requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_RESULT); 
      } 
     } else { 
      cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler); 
     } 
     }catch(CameraAccessException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void startPreview() { 
     SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); 
     surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     Surface previewSurface = new Surface(surfaceTexture); 

     try { 
      mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
      mCaptureRequestBuilder.addTarget(previewSurface); 

      mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), 
        new CameraCaptureSession.StateCallback() { 
         @Override 
         public void onConfigured(CameraCaptureSession session) { 
          try { 
           session.setRepeatingRequest(mCaptureRequestBuilder.build(), 
             null, mBackgroundHandler); 
          } catch (CameraAccessException e){ 
           e.printStackTrace(); 
          } 
         } 

         @Override 
         public void onConfigureFailed(CameraCaptureSession session) { 
          Toast.makeText(getActivity(), "Unable to connect to camera", Toast.LENGTH_LONG).show(); 
         } 
        }, null); 
     } catch (CameraAccessException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void startBackgroundThread() { 
     mBackgroundHandlerThread = new HandlerThread("PROJETDILEMMA"); 
     mBackgroundHandlerThread.start(); 
     mBackgroundHandler = new Handler(mBackgroundHandlerThread.getLooper()); 
    } 

    private void stopBackgroundThread(){ 
     mBackgroundHandlerThread.quitSafely(); 
     try { 
      mBackgroundHandlerThread.join(); 
      mBackgroundHandlerThread = null; 
      mBackgroundHandler = null; 
     } catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 
    } 

    private static Size chooseOptimalSize(Size[] choices, int width, int height) { 
     List<Size> bigEnough = new ArrayList<Size>(); 
     for(Size option : choices){ 
      if(option.getHeight() == option.getWidth() * height/width && 
        option.getWidth() >= width && option.getHeight() >= height) { 
       bigEnough.add(option); 
      } 
     } 
     if(bigEnough.size() > 0){ 
      return Collections.min(bigEnough, new CompareSizeByArea()); 
     } else { 
      return choices[0]; 
     } 
    } 
} 

Jedes Mal, wenn ich das Projekt ausführen, der Fehler, den ich bekommen ist:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                     at chom.com.dilemma17.CameraFragment.onCreateView(CameraFragment.java:41) 

das etwas mit dem zu tun hat:

mTextureView = (TextureView) getView().findViewById(R.id.textureView); 

, dass ich völlig ignorieren .. Danke für Ihre Hilfe!

Antwort

1

Für Ihren Fehler sieht es so aus, als ob Sie getView() innerhalb der onCreateView()-Methode aufrufen. getView() is supposed to get the layout that is returned by onCreateView().

Seit Ihrer Ansicht nach noch nicht innerhalb onCreateView() erstellt wurde, sollten Sie stattdessen das aufgeblasene Layout verwenden Ihre Referenz zu greifen:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_camera, container, false); 

    mTextureView = (TextureView) rootView.findViewById(R.id.textureView); 

    return rootView; 
}