首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Camera 預覽啟動失敗:SurfaceView addView 空指針異常排查

     編輯:程式設計綜合問答

錯誤堆疊

java.lang.NullPointerException
    at preview.addView(mPreview)  // mPreview 為 null

代碼邏輯:

mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = findViewById(R.id.camerapreview);
preview.addView(mPreview);  // 此處崩潰

根本原因分析

  1. mCamera 為 null:未正確打開相機(Camera.open() 失敗、權限缺失、被其他進程佔用)。
  2. CameraPreview 構造函數內部因 mCamera == null 拋出異常或返回未完全初始化的對象,導致 mPreview 賦值為 null。
  3. findViewById(R.id.camerapreview) 返回 null:布局文件中無此 ID,或 setContentView 未調用/調用錯誤布局。

修正代碼

public class CameraActivity extends Activity {
    private Camera mCamera;
    private CameraPreview mPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);  // 確保布局正確

        // 1. 安全獲取相機實例
        try {
            mCamera = Camera.open();  // 或 Camera.open(cameraId)
        } catch (Exception e) {
            Log.e("Camera", "Open failed", e);
            Toast.makeText(this, "無法打開相機", Toast.LENGTH_LONG).show();
            finish();
            return;
        }

        // 2. 創建預覽並添加
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = findViewById(R.id.camerapreview);
        if (preview != null && mPreview != null) {
            preview.addView(mPreview);
        } else {
            Log.e("Camera", "preview 或 mPreview 為 null");
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }
}

關鍵檢查清單

  • 清單文件聲明權限:<uses-permission android:name="android.permission.CAMERA"/>。
  • 清單文件聲明特性:<uses-feature android:name="android.hardware.camera" android:required="true"/>。
  • Android 6.0+ 動態申請權限(requestPermissions)。
  • 布局文件 FrameLayout ID 為 camerapreview。

參考教程

Android Camera 預覽完整實現指南

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved