赞
踩
开发环境是Android studio 北极狐,CameraX1.0.0-alpha02,实现语言是Java。
1.引入CameraX
在build.gradle添加要引入CameraX的版本。
//CameraX
def camerax_version = "1.0.0-alpha02"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
2.在AndroidManifest.xml添加打开摄像头的权限和读写文件的权限。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
android:requestLegacyExternalStorage="true"
3.在工程里面新添加一个Activity。
4.CameraXDemo代码。
public class IdentificationPhoto extends AppCompatActivity
{
private int REQUEST_CODE_PERMISSIONS = 101;
private final String [] REQUIRED_PERMISSIONS =new String[] {"android.permission.CAMERA","android.permission.WRITE_EXTERNAL_STORAGE"};
TextureView textureView;
ImageView cameraFlip;
private int backlensfacing = 0;
private int flashLamp = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camerax_demo);
//去掉导航栏
getSupportActionBar().hide();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
textureView = findViewById(R.id.view_camera);
cameraFlip = findViewById(R.id.btn_switch_camera);
cameraFlip.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if(backlensfacing == 0)
{
startCamera(CameraX.LensFacing.FRONT);
backlensfacing = 1;
}
else if(backlensfacing == 1)
{
startCamera(CameraX.LensFacing.BACK);
backlensfacing = 0;
}
}
});
if(allPermissionsGranted())
{
startCamera(CameraX.LensFacing.BACK);
}
else {
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
}
}
private void startCamera(CameraX.LensFacing CAMERA_ID)
{
unbindAll();
Rational aspectRatio = new Rational(textureView.getWidth(), textureView.getHeight());
Size screen = new Size(textureView.getWidth(),textureView.getHeight());
PreviewConfig pConfig;
Preview preview;
pConfig = new PreviewConfig.Builder().setLensFacing(CAMERA_ID).setTargetAspectRatio(aspectRatio).setTargetResolution(screen).build();
preview = new Preview(pConfig);
preview.setOnPreviewOutputUpdateListener(new Preview.OnPreviewOutputUpdateListener() {
@Override
public void onUpdated(Preview.PreviewOutput output)
{
ViewGroup parent = (ViewGroup)textureView.getParent();
parent.removeView(textureView);
parent.addView(textureView,0);
textureView.setSurfaceTexture(output.getSurfaceTexture());
updateTransform();
}
});
final ImageCaptureConfig imageCaptureConfig ;
imageCaptureConfig= new ImageCaptureConfig.Builder().setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY).setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).setLensFacing(CAMERA_ID).build();
final ImageCapture imgCap = new ImageCapture(imageCaptureConfig);
findViewById(R.id.btn_flash).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if (flashLamp == 0)
{
flashLamp = 1;
imgCap.setFlashMode(FlashMode.OFF);
Toast.makeText(getBaseContext(), "Flash Disable", Toast.LENGTH_SHORT).show();
}
else if(flashLamp == 1)
{
flashLamp = 0;
imgCap.setFlashMode(FlashMode.ON);
Toast.makeText(getBaseContext(), "Flash Enable", Toast.LENGTH_SHORT).show();
}
}
});
findViewById(R.id.btn_takePict).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
File image = null;
String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_"+ timeStamp + "_";
File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
try {
image = File.createTempFile(
imageFileName,
".jpeg",
storageDir);
}
catch (IOException e)
{
e.printStackTrace();
}
File file = new File(image.getAbsolutePath());
imgCap.takePicture(file, new ImageCapture.OnImageSavedListener()
{
@Override
public void onImageSaved(@NonNull File file)
{
String msg = "Pic saved at "+ file.getAbsolutePath();
galleryAddPic(file.getAbsolutePath());
Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
}
@Override
public void onError(@NonNull ImageCapture.UseCaseError useCaseError, @NonNull String message, @Nullable Throwable cause) {
String msg = "Pic saved at "+ message;
Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show();
if (cause !=null){
cause.printStackTrace();
Toast.makeText(getBaseContext(), cause.toString(),Toast.LENGTH_LONG).show();
}
}
});
}
});
bindToLifecycle(this,preview, imgCap);
}
private void galleryAddPic(String currentFilePath){
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File file = new File (currentFilePath);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
//Toast.makeText(getBaseContext(), "saved to gallery",Toast.LENGTH_LONG).show();
}
private void updateTransform(){
Matrix mx = new Matrix();
float w = textureView.getMeasuredWidth();
float h = textureView.getMeasuredHeight();
float cX = w / 2f;
float cY = h / 2f;
int rotationDgr;
int rotation = (int)textureView.getRotation();
switch (rotation){
case Surface.ROTATION_0:
rotationDgr = 0;
break;
case Surface.ROTATION_90:
rotationDgr = 90;
break;
case Surface.ROTATION_180:
rotationDgr = 180;
break;
case Surface.ROTATION_270:
rotationDgr = 270;
break;
default: return;
}
mx.postRotate((float)rotationDgr, cX,cY);
textureView.setTransform(mx);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUEST_CODE_PERMISSIONS){
if (allPermissionsGranted()) {
startCamera(CameraX.LensFacing.BACK);
}
else{
Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
finish();
}
}
}
private boolean allPermissionsGranted()
{
for(String permission : REQUIRED_PERMISSIONS)
{
if(ContextCompat.checkSelfPermission(this, permission)!= PackageManager.PERMISSION_GRANTED)
{
return false;
}
}
return true;
}
private boolean checkCameraHardware(Context context)
{
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
private void toggleFrontBackCamera()
{
}
}
5.在布局文件里面添加
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CameraXDome">
<TextureView
android:id="@+id/view_camera"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<ImageButton
android:id="@+id/btn_takePict"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_camera"
android:layout_marginBottom="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
</ImageButton>
<ImageButton
android:id="@+id/btn_flash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_flash"
android:layout_marginBottom="35dp"
android:layout_marginStart="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent">
</ImageButton>
<ImageButton
android:id="@+id/btn_switch_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_switch_camera"
android:layout_marginBottom="30dp"
android:layout_marginStart="330dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent">
</ImageButton>
</androidx.constraintlayout.widget.ConstraintLayout>
6.运行APP,因为模拟器没有前视摄像头,上真机调试就可以看到效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。