2

我的應用程序具有相機功能。它適用於所有Android版本,但現在當我在S3中測試它崩潰。錯誤指向這一行:Android 4.1(API級別16)中的相機崩潰

Parameters parameters = mCamera.getParameters(); 

在:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Log.e(TAG, "surfaceChanged"); 
    // XXX stopPreview() will crash if preview is not running 
    if (mPreviewRunning) { 
     mCamera.stopPreview(); 
    } 

    /** 
    * CODE TO RESOLVE CAMERA ORIENTATION PROBLEM START 
    */ 

    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
      .getDefaultDisplay(); 
    int flashStatus = session1.getFlashStatus(); 
    Parameters parameters = mCamera.getParameters(); 
    if (flashStatus == 0) { 
     btnFlash.setBackgroundResource(R.drawable.flash); 
     parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); 
     mCamera.setParameters(parameters); 
    } else if (flashStatus == 1) { 
     btnFlash.setBackgroundResource(R.drawable.flash_on); 
     parameters.setFlashMode(Parameters.FLASH_MODE_ON); 
     mCamera.setParameters(parameters); 
    } else { 
     btnFlash.setBackgroundResource(R.drawable.flash_off); 
     parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
     mCamera.setParameters(parameters); 
    } 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

    if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO) { 
     // Do something for froyo and above versions 
     if (display.getRotation() == Surface.ROTATION_0) { 
      // parameters.setPreviewSize(h, w); 
      mCamera.setDisplayOrientation(90); 
     } 
     if (display.getRotation() == Surface.ROTATION_90) { 
      // parameters.setPreviewSize(w, h); 
     } 
     if (display.getRotation() == Surface.ROTATION_180) { 
      // parameters.setPreviewSize(h, w); 
      mCamera.setDisplayOrientation(-90); 
     } 
     if (display.getRotation() == Surface.ROTATION_270) { 
      // parameters.setPreviewSize(w, h); 
      mCamera.setDisplayOrientation(90); 
     } 
    } else { 
     // do something for phones running an SDK before level 9 
     if (display.getOrientation() == Surface.ROTATION_0) { 
      // parameters.setPreviewSize(h, w); 
      mCamera.setDisplayOrientation(90); 
     } 
     if (display.getOrientation() == Surface.ROTATION_90) { 
      mCamera.setDisplayOrientation(90); 
      // parameters.setPreviewSize(w, h); 
     } 
     if (display.getOrientation() == Surface.ROTATION_180) { 
      mCamera.setDisplayOrientation(90); 
      // parameters.setPreviewSize(h, w); 
     } 
     if (display.getOrientation() == Surface.ROTATION_270) { 
      mCamera.setDisplayOrientation(90); 
      // parameters.setPreviewSize(w, h); 
      // mCamera.setDisplayOrientation(180); 
     } 
    } 

    mCamera.setParameters(parameters); 
    /** 
    * CODE TO RESOLVE CAMERA ORIENTATION PROBLEM END 
    */ 
    try { 
     mCamera.setPreviewDisplay(mSurfaceHolder); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    if (mPreviewRunning) { 
     mCamera.stopPreview(); 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } else { 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.e(TAG, "surfaceDestroyed"); 
    if (mPreviewRunning) { 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 
} 

可能有人提供了一個解決方案?日誌如下:

?:??: W/?(?): java.lang.NullPointerException 
?:??: W/?(?): at com.stpl.snapshun.camera.CameraActivity.surfaceChanged(CameraActivity.java:313) 
?:??: W/?(?): at android.view.SurfaceView.updateWindow(SurfaceView.java:554) 
?:??: W/?(?): at android.view.SurfaceView.access$000(SurfaceView.java:81) 
?:??: W/?(?): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) 
?:??: W/?(?): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:671) 
?:??: W/?(?): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1818) 
?:??: W/?(?): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 
?:??: W/?(?): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) 
?:??: W/?(?): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
?:??: W/?(?): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
?:??: W/?(?): at android.view.Choreographer.doFrame(Choreographer.java:525) 
?:??: W/?(?): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
?:??: W/?(?): at android.os.Handler.handleCallback(Handler.java:615) 
?:??: W/?(?): at android.os.Handler.dispatchMessage(Handler.java:92) 
?:??: W/?(?): at android.os.Looper.loop(Looper.java:137) 
?:??: W/?(?): at android.app.ActivityThread.main(ActivityThread.java:4745) 
?:??: W/?(?): at java.lang.reflect.Method.invokeNative(Native Method) 
?:??: W/?(?): at java.lang.reflect.Method.invoke(Method.java:511) 
?:??: W/?(?): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
?:??: W/?(?): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
?:??: W/?(?): at dalvik.system.NativeStart.main(Native Method) 

我的問題在這裏試圖訪問攝像頭參數返回null。

在此先感謝

+0

你能提供你的'CameraActivity'源?很明顯,「mCamera」爲空,但很難確定原因。 – Grimmace

回答

2

Lincy下面是攝像頭等查看代碼

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) 
{ 
    if(mPreviewRunning) 
    { 
     mCamera.stopPreview(); 
    } 

    // Store width and height 
    mWidth = width; 
    mHeight = height; 

    // Set camera parameters 
    Camera.Parameters p = mCamera.getParameters(); 
    mCamera.setParameters(p); 

    if(android.os.Build.VERSION.SDK_INT >= 8) 
    { // If API >= 8 -> rotate display... 
     mCamera.setDisplayOrientation(90); 
    } 

    try 
    { 
     mCamera.setPreviewDisplay(holder); 
    } catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 

    mCamera.startPreview(); 
    mPreviewRunning = true; 

} 
public void surfaceCreated(final SurfaceHolder holder) 
{ 
    try { 
     mCamera = Camera.open(); 
     mCamera.setPreviewDisplay(holder); 
    } catch (IOException e) 
    { 
     mCamera.release(); 
     mCamera = null; 
     e.printStackTrace(); 
    } 
} 

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

一件事你實現你的類使用

衝浪aceHolder.Callback

+0

謝謝!雅,我實現SurfaceHolder.Callback ...會嘗試這個代碼... – Lincy

+0

你可以把整個班級?其實我需要看看你在你的surfaceCreated和surfaceDestroyed中做了什麼...它可能是我錯了 – Lincy

+0

我編輯了代碼並添加了SurfaceCreated和SurfaceDestroyed –

0

我也有相同的問題在S3中的相機活動,並得到修復。它對我有好處。

我不知道。如果我正確地使用,你正在使用你自己的代碼用於使用surfaceview的相機。

所以對於更高版本的Android版本(<蜂窩)更好地啓動默認的攝像頭。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

,並專門爲S3(拍攝的圖像尺寸變至4 MB),如果u被上傳到網絡更好地調整它的大小和上傳。因爲您會再次發生內存警告並再次崩潰,因此會持續捕獲並上傳超過2-3張照片。

+0

謝謝,但使用的是默認的相機不會爲我工作:( – Lincy

+0

遺憾未能幫你嗎?再次得到了崩潰? – VIGNESH

+0

號我需要修改相機的外觀,所以這不會對我 – Lincy

0

這可能是由於文件尺寸較大嘗試重新大小的圖像,並檢查是否正常工作 重新大小的圖像 試試這個

public static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 

    int width = bm.getWidth(); 

    int height = bm.getHeight(); 

    float scaleWidth = ((float) newWidth)/width; 

    float scaleHeight = ((float) newHeight)/height; 

    // create a matrix for the manipulation 

    Matrix matrix = new Matrix(); 

    // resize the bit map 

    matrix.postScale(scaleWidth, scaleHeight); 

    // recreate the new Bitmap 

    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, 

      matrix, false); 

    return resizedBitmap; 
} 
+0

問題工作是,當它的應用程序採用的是Android 4.1 – Lincy

+0

我剛剛測試了我的相機虛擬應用程序與Android操作系統的Galaxy NoteII運行返回的攝像頭實例爲null 4.1.1攝像頭活動是工作的罰款沒有崩潰,必須有別的東西導致應用程序崩潰 –

+0

能不能請你剛落,在該代碼給我嗎?你有沒有使用相同的方法,我在這裏使用? – Lincy

0

對不起,我遲到更新。問題出在設備沒有自動對焦的時候。所以你需要首先檢查設備是否有自動對焦:boolean focus = getPackageManager()。hasSystemFeature(「android.hardware.camera.autofocus」);

+0

我面臨的問題與您在本主題中描述的相同,但我不清楚我應該如何處理焦點變量的值,如果是的話,我應該做一些特別的事情? – German

0

德國,看看這可以幫助你的想法: -

mCamera.autoFocus(myAutoFocusCallback); 

/** 
    * If camera having autofocus which is calling here 
    */ 
    AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() { 

     @Override 
     public void onAutoFocus(boolean start, Camera arg1) { 
      if (focus) { 
       if (start) { 
        if (mPreviewRunning) { 
         mCamera.takePicture(myShutterCallback, mPicture, 
           mPicture); 
        } 
       } else { 
        btnCamera.setEnabled(true); 
        side.setEnabled(true); 
        showToast("Could not get focus. Try again."); 
       } 
      } else { 
       if (mPreviewRunning) { 
        mCamera.takePicture(myShutterCallback, mPicture, mPicture); 
       } 
      } 
     } 
    }; 


ShutterCallback myShutterCallback = new ShutterCallback() { 

     @Override 
     public void onShutter() { 
      showToast("Picture taken!"); 
     } 
    };