如何创建Android应用:图片挑选

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。

Creating Package

创建软件包后,再次在utils软件包上单击鼠标右键,然后选择Java Class选项。

Creating 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

from: https://dev.to//edrome/how-to-create-an-android-app-picture-picking-4501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值