经过大量的研究,我找到了这个解决方案。为了使事情更清楚,我创建了一个完整的应用程序来回答这个问题,该应用程序旨在打开相机,拍照并将图像设置为ImageView的ImageBitmap。此问题中要求的代码从第二个块开始,即setView()方法,该方法位于onCreate()方法之下,接下来是onActivityResult()方法。
以下是该应用程序的演示。
以下是我附上的MainActivity.java文件
package com.cr7.opencamera;
import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button buttonCaptureImageFromCamera;
private Uri imageUri;
private ImageView imageViewCameraImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonCaptureImageFromCamera = findViewById(R.id.buttonCaptureImageFromCamera);
imageViewCameraImage = findViewById(R.id.imageViewCameraImage);
askPermission();
}
这里的imageUri是全局变量,可以在onActivityResult()方法中使用
private void setView() {
buttonCaptureImageFromCamera.setOnClickListener(v -> {
String fileName = "new-photo-name.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");
imageUri =
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, 1231);
});
}
这是onActivityResult方法。在这里,我使用了imageUri,即在setView()方法中按钮的OnClickListener中初始化的类型为Uri的全局变量。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1231 && resultCode == Activity.RESULT_OK) {
try {
ContentResolver cr = getContentResolver();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(cr, imageUri);
imageViewCameraImage.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
} catch (IllegalArgumentException e) {
if (e.getMessage() != null)
Log.e("Exception", e.getMessage());
else
Log.e("Exception", "Exception");
e.printStackTrace();
}
}
}
剩余的代码...
public void askPermission() {
if (
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 60);
} else {
setView();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean allPermissionsGranted = false;
if ( requestCode == 60 && grantResults.length > 0) {
allPermissionsGranted = grantResults[0] == PackageManager.PERMISSION_GRANTED
&&
grantResults[1] == PackageManager.PERMISSION_GRANTED;
}
if ( allPermissionsGranted ) {
setView();
}
}
}
这些代码块是按顺序排列的,即如果您合并所有这些块,则可以获得完整的MainActivity.java类。
如果您想要实现此应用程序,您需要创建一个布局文件,其中包含一个ID为“imageViewCameraImage”的ImageView和一个ID为“buttonCaptureImageFromCamera”的按钮。
希望这可以帮助到您。我知道这很长,但我正在通过编写此内容使其变得更长。
敬礼,
乔尔