2

私のアプリケーションにはカメラ機能があります。すべての Android バージョンで正常に動作しますが、S3 でテストするとクラッシュします。エラーは次の行を指しています。

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 が返されることです。

前もって感謝します

4

5 に答える 5

2

Licy これが Class Camera View のコードです

 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;
    }   
}

もう1つ、クラスを実装しました

SurfaceHolder.Callback

于 2012-12-11T05:08:09.937 に答える
0

私もS3のカメラアクティビティで同じ問題を抱えていて、修正されました。それは私にとってうまくいきました。

私はわかりません 。私が正しく理解している場合は、surfaceviewを使用したカメラ用の独自のコードを使用しています。

したがって、より高いAndroidバージョン(<ハニカム)の場合は、デフォルトのカメラを起動する方が適切です。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

特にS3(キャプチャされた画像のサイズは4 Mbまでになります)の場合、uがWebにアップロードしている場合は、サイズを変更してアップロードします。メモリの警告とクラッシュが再び発生するため、2〜3枚以上の画像が継続的にキャプチャされ、アップロードされます。

于 2012-12-07T06:40:50.100 に答える
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;
}
于 2012-12-07T08:05:28.460 に答える
0

更新が遅くなり申し訳ありません。問題は、デバイスにオートフォーカスがない場合でした。したがって、最初にデバイスにオートフォーカスがあるかどうかを確認する必要があります: boolean focus = getPackageManager().hasSystemFeature( "android.hardware.camera.autofocus");

于 2012-12-28T11:08:58.287 に答える