Android 拍照和相册选取+图片压缩功能(兼容6.0以下,6.0, 7.0,8.0)

该博客介绍了如何在Android应用中实现拍照、相册选图功能,并使用Luban库进行图片压缩。针对不同Android版本(6.0以下、6.0及以上7.0+)的权限管理和文件路径处理进行了详细说明,包括运行时权限动态申请、FileProvider的使用。7.0+版本中,由于安全原因,需要通过ContentProvider获取文件路径。博客提供了一个简单的MainActivity和FaceBlackPopWindow源码示例,并提示Luban压缩框架将在另一篇博客中单独讨论。
摘要由CSDN通过智能技术生成

      将拍照和相册选图封装成Demo,图片压缩用的是Android 开源压缩框架——Luban。先上效果动图:

                                                             

                                                                                    效果图

        

       一言以蔽之,拍照和相册选图这个开发中常见的功能,版本之间的重要区别是:

             6.0以下的版本:只要在AndroidManifest中注明相机的使用权限,SDCard的读写2权限,就能在正常的写功能了

             6.0:6.0以后Google不再允许开发者直接或许应用的权限,需要在用户知情的情况下授予权限,这便是运行时权限。相机,读,写3个权限除了要在AndroidManifest先声明,在写功能代码的时候还要做动态申请的操作。

             7.0+: 众所周知Android四大组件之一内容提供器的作用,便是在不同的应用程序之间实现数据共享, Android 从 N 版本开始禁止通过 file://Uri 的方式在不同 App 之间共享文件,如此以来7.0版本以下直接获取图片文件路径的方法行不通了,所以我们写的应用,就需要通过内容提供器的方式,来获取系统文件管理器中目标文件的路径。

         主要源码如下:

  MainActivity:

package p.com.lubandemo.activity;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.io.File;

import p.com.lubandemo.R;
import p.com.lubandemo.rx.RxBus;
import p.com.lubandemo.rx.RxBusBaseMessage;
import p.com.lubandemo.rx.RxCode;
import p.com.lubandemo.util.STContext;
import p.com.lubandemo.view.FaceBlackPopWindow;
import rx.Subscription;
import rx.functions.Action1;
import top.zibin.luban.Luban;
import top.zibin.luban.OnCompressListener;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Handler uiHandler;
    private Context context;
    private FaceBlackPopWindow popupWindow;
    private Button  btn_popwindow;
    MainActivity activity;

    //动态写权限所用
    public static boolean writeAccepted = false;
    public static final int TAKE_PICTURE = 0;
    public static final int PHOTO_REQUEST_GALLERY = 1;        // 从相册中选择
    public static Uri phototUri = null;
    //7.0+ 拍照源路径所用
    String loadUrl = "";
    //所选相册图片的路径
    String albumPath = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uiHandler = new Handler();
        activity = this;
        btn_popwindow = findViewById(R.id.btn_popwindow);
        context = MainActivity.this;
        btn_popwindow.setOnClickListener(this);
        Subscription subscription = RxBus.getDefault()
                .toObservable(RxBusBaseMessage.class)
                .subscribe(new Action1<RxBusBaseMessage>() {
                    @Override
                    public void call(RxBusBaseMessage message) {
                        if (message.getCode() == RxCode.FACE_BLACK_DISMISS) {

                            uiHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    /**
                                     更新UI
                                     */
                                    dismissPop();
                                }
                            });
                        }
                    }
                });
    }

    //6.0+运行时权限---写权限请求回掉函数(相机用)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

        switch (requestCode) {
            case 1:
                writeAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                break;
        }
    }


    private void dismissPop()
    {
        if(popupWindow!=null &&popupWindow.isShowing())
        {
            popupWindow.dismiss();
        }
    }


    private void showFaceBlackPop()
    {
        popupWindow = new FaceBlackPopWindow(activity,activity.getWindow());
        //弹出修改/次增加人脸黑名单弹出窗
        //控件,为了popWindow一个基准``````````````
        Button lin_face_warn = btn_popwindow;
        popupWindow.showWindow(lin_face_warn);
    }

   // 压缩后图片文件存储位置
    private String getPath() {
        String path = STContext.getInst().imageFilePath;
        File file = new File(path);
        if (file.mkdirs()) {
            return path;
        }
        return path;
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) { // 如果返回码是可以用的
            switch (requestCode) {
                case TAKE_PICTURE:
                    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
                        //6.0以及以下的处理   luban 图片压缩的开源库
                        Luban.with(context)
                                .l
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了在Android Studio中实现拍照和从相册选取图片的功能,您需要执行以下操作: 1.添加以下权限到AndroidManifest.xml文件中: <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera"/> 2.在主要活动(Main Activity)中添加以下代码来调用相机并拍照: private static final int CAMERA_REQUEST = 1888; private Button button; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); imageView = (ImageView)findViewById(R.id.imageView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(photo); } } 3.在主要活动中添加以下代码来调用相册选取图片: private static final int PICK_IMAGE_REQUEST = 1; private Button button1; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); imageView = (ImageView)findViewById(R.id.imageView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(galleryIntent, PICK_IMAGE_REQUEST); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); } } 确保您在AndroidManifest.xml文件中添加了必要的权限,并按照上述代码操作,就可以实现在Android Studio中拍照和从相册选取图片的功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值