2

私はカスタムカメラアプリケーションを開発しています。以下は私のアクティビティクラスです。下記の.setPreviewDisplay(holder)nullポインタ例外を投げる

public class MyCustomCam extends Activity { 
private Camera mCamera;  
private CameraPreview mPreview; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mCamera = getCameraInstance();  
    mPreview = new CameraPreview(this, mCamera);   
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);  
    preview.addView(mPreview); 
} 
    public static Camera getCameraInstance(){  
     Camera c = null;  
     try { 
     c = Camera.open(); // attempt to get a Camera instance  
     } 
     catch (Exception e){   
      // Camera is not available (in use or does not exist)  
      }  
     return c; // returns null if camera is unavailable} 

     } 
     } 

は私のmain.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
<FrameLayout 
    android:id="@+id/camera_preview"  
    android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
      android:layout_weight="1" /> 
     <Button android:id="@+id/button_capture" 
      android:text="Capture" 
     android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:layout_gravity="center" 
    /></LinearLayout> 

であり、これは私のCameraPreviewクラス

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {  
private SurfaceHolder mHolder;  
private Camera mCamera;  
public CameraPreview(Context context, Camera camera) {   
    super(context);   
    mCamera = camera;  // Install a SurfaceHolder.Callback so we get notified when the  
    // underlying surface is created and destroyed.   
    mHolder = getHolder();  
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0   
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
public void surfaceCreated(SurfaceHolder holder) {  
    // The Surface has been created, now tell the camera where to draw the preview.   
    try {    
     mCamera.setPreviewDisplay(holder);    
     mCamera.startPreview();   
    } catch (IOException e) {    

     Log.d("", "Error setting camera preview: " + e.getMessage());  
     } 
    } 
public void surfaceDestroyed(SurfaceHolder holder) { 
      // empty. Take care of releasing the Camera preview in your activity. 
    }  
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here.   
     // Make sure to stop the preview before resizing or reformatting it.   
     if (mHolder.getSurface() == null){   // preview surface does not exist   
      return;  }  // stop preview before making changes   
     try {    
      mCamera.stopPreview();  
     } catch (Exception e){  
      // ignore: tried to stop a non-existent preview  
      }  // set preview size and make any resize, rotate or 
     // reformatting changes here  // start preview with new settings 
     try {    
      mCamera.setPreviewDisplay(mHolder);   
      mCamera.startPreview();  
     } catch (Exception e){   
      Log.d("", "Error starting camera preview: " + e.getMessage()); 
      } 
} 
    } 
ここ

mCamera.setPreviewDisplay(holder); 

コードは、nullポインタ例外をスローして..です私はなぜそれがスローであるか教えてください。例外とはどのように修正できますか?

+0

私は同じバグがあります。どのようにこれを修正しましたか?あなたは案内していただけますか? – sanjana

答えて

2

私は同じバグを抱えていました。

このQ & Aを使用して問題を解決しました。特に、surfaceChangedに設定されているparams.setPreviewSize(...)より前に呼び出されたgetBestPreviewSize(...)関数の追加を参照してください。変更を行うための注意点として

Android - cam.setPreviewDisplay(holder) running into IOError

(これは私の次のバグだったので)、あなたは(たとえば、タイトルバーを削除する)レイアウトのいずれかのより多くのカスタマイズをやって起動すると、UIへの「要求」以下のリンクに書かれているsetContentView(...)の前に作成する必要があります。おそらくあなたの問題はあなたのエミュレータのカメラの設定ということでしょう

requestFeature() must be called before adding content

+0

あなたは私の個人的なヒーローになったので、解決策は私が前進するのを助けました。公式の文書には、一番良いプレビューサイズを選んだという行を除いてこれについての言及はありません。もう一度ありがとう –

0

。 AVDマネージャーに移動し、エミュレーターを編集してカメラを設定し、エミュレートすることができます。エミュレータを再起動してアプリを起動してください。

6

あなたsurfaceDestroyed機能

public void surfaceDestroyed(SurfaceHolder holder) { 
     if (mCamera != null) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
} 

にカメラを解放し、あなたのマニフェストファイル内のカメラの権限を追加してください。

<uses-permission android:name="android.permission.CAMERA" /> 
関連する問題