Hi again (x2) everyone!
我们在上一篇文章中讨论了日期选择器和名称文本视图,因为我们已经检查了单选按钮,然后检查个人资料照片的更改。 我们将使用mikhaellopez软件包中的“圆形图像视图”; Glide,一种轻松加载和缓存图像的方式; Image Cropper,如果要裁剪图像以使其适合组件,这是一个非常有用的库; 和Dexter,这是一种非常简单的请求权限的方法。
让我们从app build gradle中的以下实现开始
implementation 'com.mikhaellopez:circularimageview:4.0.1'
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.karumi:dexter:5.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
api 'com.theartofdev.edmodo:android-image-cropper:+'
在我们的内容主目录中,转到文本版本并添加CiruclarImageView组件,在width和height属性上定义一个大小。 还选择一个图像以可视化设计布局中的组件。
<com.mikhaellopez.circularimageview.CircularImageView
android:id="@+id/profile_imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:contentDescription="@string/nav_header_desc"
android:src="@drawable/baseline_person_outline_24px"
android:onClick="showPictureDialog"
app:layout_constraintBottom_toTopOf="@+id/profile_username_edittext"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/profile_photo_textview" />
I set a default image to circular image. I get it from material.io resources are free.
该组件需要允许用户拍照或从图库中选择一个的逻辑。 该功能是通过使用android imagecropper附加完成的,在清单中添加了权限。
<manifest>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application>
....
<activity
android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat" />
</application>
</manifest>
为了保持项目的可读性,我们将创建一个名为utils的软件包,将在其中放置照片选择逻辑。 右键单击主软件包,然后依次单击新建和软件包,即可完成软件包的创建。 输入一个名称,在我的情况下是utils。
创建软件包后,再次在utils软件包上单击鼠标右键,然后选择Java Class选项。
为班级取一个名字(我的名字是照片),在此过程之后,我们将在功能上写下一个小的调用对话框,让用户拍摄照片或从各种来源中选择照片。 该方法是静态的,因为不需要创建对象并将其存储在内存中。
public static void choosePhoto(Activity activity) {
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.start(activity);
}
随后,在Main activity java类中,我们将添加下面介绍的severus方法。
首先,单击圆形图像视图时要调用的方法。 就像我在上一篇文章中所说的那样,要创建一个称为onClick事件的方法,它必须是公共的,无效的,其形式参数为View类型。 在此方法内部,它将调用我们的方法,向用户显示对话框,让他选择照片来源。
public void showPictureDialog(View view) {
photo.choosePhoto(this);
}
选择图像后,我们将覆盖一个onActivityResult方法,该方法会在选择图像时将其置于“圆形图像视图”中。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == this.RESULT_CANCELED) {
return;
} else if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
try {
Bitmap bitmap = MediaStore.Images.Media
.getBitmap(this.getContentResolver(),resultUri);
Glide.with(this).load(bitmap).into(imageview);
} catch (IOException e) {
e.printStackTrace();
}
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
此外,用户需要给我们足够的权限才能访问他的媒体内容。 Dexter是另一个库,它通过实现几个方法来简化此任务。 (我将解释最简单的部分,因此,如果您想深入了解所有可用功能,请参阅其文档,我将在本文结尾列出所有库)
private void requestMultiplePermissions(){
Dexter.withActivity(this)
.withPermissions(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(
new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
// check if all permissions are granted
if (report.areAllPermissionsGranted()) {
Toast.makeText(getApplicationContext(),
"All permissions are granted by user!",
Toast.LENGTH_SHORT).show();
}
// check for permanent denial of any permission
if (report.isAnyPermissionPermanentlyDenied()) {
// show alert dialog navigating to Settings
}
}
@Override
public void onPermissionRationaleShouldBeShown(
List<PermissionRequest> permissions,
PermissionToken token) {
token.continuePermissionRequest();
}
}).
withErrorListener(new PermissionRequestErrorListener() {
@Override
public void onError(DexterError error) {
Toast.makeText(getApplicationContext(),
"Some Error! ",
Toast.LENGTH_SHORT).show();
}
})
.onSameThread()
.check();
}
我们使用主要对象Dexter,告诉他们除了写入和读取存储空间之外,我们还需要对照相机的权限。 可以实现监听器,您可以在用户拒绝访问或想要向用户显示权限对话框时执行操作。 最后,当发生错误时,您可以显示一条链接到更多例程的消息。 我们刚刚创建的方法将在onCreate方法中调用,需要注意的重要一点是,您必须初始化图像视图,否则将获得空指针异常。
就是这样,现在您有了一个功能齐全的图片选择器,可以用相机拍摄,也可以从内部/外部存储中选择它。
正如我所说,这是所有图书馆文档的链接。
dexter
Glide
CircularImageView
Image Cropper
material.io
Here it is the link to the github project