在Android 11中,相机意向(Camera Intents)不再像之前那样直接响应。为了适应此更改,您可以使用新的相机X包或使用相机API来解决这个问题。以下是一些解决方法的示例代码:
首先,请确保在您的项目中添加了相机X包的依赖项。在build.gradle文件中添加以下依赖项:
dependencies {
implementation 'androidx.camera:camera-camera2:1.1.0-alpha09'
implementation 'androidx.camera:camera-lifecycle:1.1.0-alpha09'
implementation 'androidx.camera:camera-view:1.0.0-alpha23'
}
然后,在您的Activity或Fragment中,您可以使用相机X库来处理相机意向。以下是一个示例代码:
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.ExecutionException;
public class MainActivity extends AppCompatActivity {
private ListenableFuture cameraProviderFuture;
private PreviewView previewView;
private ImageCapture imageCapture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize the preview view
previewView = findViewById(R.id.cameraPreview);
// Initialize the camera provider
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
// Request camera permissions if needed
// ...
// Set up the camera provider
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindCameraUseCases(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}, ContextCompat.getMainExecutor(this));
}
private void bindCameraUseCases(ProcessCameraProvider cameraProvider) {
// Set up the preview use case
Preview preview = new Preview.Builder().build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
// Set up the image capture use case
imageCapture = new ImageCapture.Builder().build();
// Set up the camera selector
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
// Bind the use cases to the camera provider
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
}
// Handle the result of the camera intent
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// Handle the captured image
// ...
}
}
// Capture an image
private void captureImage() {
File photoFile = createPhotoFile();
ImageCapture.OutputFileOptions outputFileOptions =
new ImageCapture.OutputFileOptions.Builder(photoFile).build();
imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(this),
new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
// Image capture success
// ...
}
@Override
public void onError(ImageCaptureException exception) {
// Image capture error
// ...
}
});
}
// Create a file to save the captured image
private File createPhotoFile() {
// ...
}
}
如果您不想使用相机X包,您仍然可以使用相机API来处理相机意向。以下是一个示例代码:
import android.content.Intent;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_IMAGE_CAPTURE = 1;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize the image view
imageView = findViewById(R.id.imageView);
// Launch the camera intent
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent