Camera3D.java
public class Camera3D {
Context context;
CameraManager manager;
private Size size;
private CameraDevice camera;
private HandlerThread handlerThread;
private Handler handler;
CaptureRequest.Builder captureBuilder;
@SuppressWarnings("MissingPermission")
public Camera3D(Context context){
this.context=context;
handlerThread=new HandlerThread("Camera2");
handlerThread.start();
handler=new Handler(handlerThread.getLooper());
manager=(CameraManager)context.getSystemService(Context.CAMERA_SERVICE);
try {
CameraCharacteristics characteristics = manager.getCameraCharacteristics("0");
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
size=map.getOutputSizes(SurfaceTexture.class)[0];
manager.openCamera("0", mDeviceCallback, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
public void startPreview(SurfaceTexture view){
Surface surface=new Surface(view);
try {
captureBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureBuilder.addTarget(surface);
camera.createCaptureSession(Arrays.asList(surface), mSessionCallback, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private CameraDevice.StateCallback mDeviceCallback=new CameraDevice.StateCallback(){
@Override
public void onOpened(CameraDevice cameraDevice) {
camera=cameraDevice;
}
@Override
public void onDisconnected(CameraDevice cameraDevice) {}
@Override
public void onError(CameraDevice cameraDevice, int i) {}
};
private CameraCaptureSession.StateCallback mSessionCallback=new CameraCaptureSession.StateCallback(){
@Override
public void onConfigured(CameraCaptureSession session) {
try {
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
session.setRepeatingRequest(captureBuilder.build(), mCaptureCallBack, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {}
};
private CameraCaptureSession.CaptureCallback mCaptureCallBack=new CameraCaptureSession.CaptureCallback(){
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
}
@Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) {
}
};
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
private final int REQUEST_CAMERA_PERMISSION=100;
TextureView textureView;
Camera3D camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN );
setContentView(R.layout.activity_main);
processPermission();
}
private void processPermission(){
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
int hasPermission=checkSelfPermission(Manifest.permission.CAMERA);
if(hasPermission!= PackageManager.PERMISSION_GRANTED){
requestPermissions(
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
return;
}
else{
init();
}
}
}
@Override
public void onRequestPermissionsResult(
int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
if(requestCode==REQUEST_CAMERA_PERMISSION){
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
init();
}
else{
Toast.makeText(this, "No permission", Toast.LENGTH_LONG).show();
}
}
else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
public void init(){
textureView=(TextureView)findViewById(R.id.textureView);
camera=new Camera3D(this);
textureView.setSurfaceTextureListener(this);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
camera.startPreview(surfaceTexture);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
}
設定檔
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.ddns.mahaljsp.camera3d">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera2" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
完整程式碼下載 : Camera3D.rar
