2016-05-04 23 views
0

私は現在、フラグメントであるのプレビュー(API 2)、snapchatのホームページカメラの種類のアプリで取り組んでいます。私は幸運のないどこでもソリューションを探していました。だから、私は今日ここで尋ねています。ここに私のコードサンプルがあります:カメラAPI 2プレビューフラグメント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]; 
     } 
    } 
} 

私はプロジェクトを実行するたびに、私が手に間違いがある:

とは何かを持っている
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) 

私は完全に無視
mTextureView = (TextureView) getView().findViewById(R.id.textureView); 

.. あなたの助けてくれてありがとう!

答えて

1

onCreateView()メソッド内でgetView()を呼び出しているため、エラーが発生したようです。 getView() is supposed to get the layout that is returned by onCreateView().

あなたのビューがonCreateView()内でまだ作成されていないので、あなたの代わりにあなたの参照をつかむために膨張したレイアウトを使用する必要があります。

@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; 
} 
関連する問題