java.lang.NullPointerException
at preview.addView(mPreview) // mPreview 為 null
代碼邏輯:
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = findViewById(R.id.camerapreview);
preview.addView(mPreview); // 此處崩潰
mCamera 為 null:未正確打開相機(Camera.open() 失敗、權限缺失、被其他進程佔用)。CameraPreview 構造函數內部因 mCamera == null 拋出異常或返回未完全初始化的對象,導致 mPreview 賦值為 null。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"/>。requestPermissions)。FrameLayout ID 為 camerapreview。