【基础笔记】Android Studio拍照、选择相册(第三方框架)

一、选择相册(FilePicker)

1、导入依赖

implementation 'cn.imlibo:FilePicker:v0.0.5_alpha'

2、使用方法

①选择指定后缀文件

FilePicker
                .from(this)
                .chooseForMimeType()//选择指定后缀文件
                .setMaxCount(10)
                .setFileTypes("png", "doc","apk", "mp3", "gif", "txt", "mp4", "zip")
                .requestCode(REQUEST_CODE_CHOOSE)//确认码
                .start();

②在图片选择器中选择图片或视频

FilePicker
                .from(this)
                .chooseMedia()//图片选择器
                .enabledCapture(true)
                .setTheme(R.style.FilePicker_Dracula)
                .requestCode(REQUEST_CODE_CHOOSE)
                .start();

③接受返回的文件

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == REQUEST_CODE_CHOOSE) {
            ArrayList<EssFile> essFileList = data.getParcelableArrayListExtra(Const.EXTRA_RESULT_SELECTION);
            StringBuilder builder = new StringBuilder();
            for (EssFile file :
                    essFileList) {
                builder.append(file.getMimeType()).append(" | ").append(file.getName()).append("\n\n");
            }
            textView.setText(builder.toString());//显示选取结果
           //setViewText(builder.toString(), pathName);通常上传的时候需要文件路径,新写一个方法保存文件路径
        }
    }

3、Git地址

FilePicker

二、拍照(TakePhoto)

①、添加依赖

 repositories {
       //glide
        mavenCentral()
        google()
    }
dependencies {
    .....
    implementation 'com.jph.takephoto:takephoto_library:4.0.3'
    //Glide图片显示
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

②、Activity实现takephoto

/**
 * 实现Takephoto,InvokeListener。重写多个方法,添加获取实例方法getPhoto,对图片进行压缩裁剪等操作。
 */
public class GetPicture extends AppCompatActivity implements TakePhoto.TakeResultListener, InvokeListener {

    @BindView(R.id.iv_choose)
    ImageView ivChoose;
    @BindView(R.id.btn_photo)
    Button btnPhoto;
    @BindView(R.id.btn_picture)
    Button btnPicture;
    @BindView(R.id.btn_multiple_choice)
    Button btnMultipleChoice;
    @BindView(R.id.iv_choose2)
    ImageView ivChoose2;
    private TakePhoto takePhoto;
    private InvokeParam invokeParam;
    ArrayList<TImage> images;//返回的图片对象
    private int flag;//1-->打开相机(裁剪),2-->打开相册(裁剪),3-->打开相册(多选裁剪)

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        getTakePhoto().onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.get_picture);
        ButterKnife.bind(this);
    }


    /**
     * 获取TakePhoto实例
     *
     * @return
     */
    public TakePhoto getTakePhoto() {
        if (takePhoto == null) {
            takePhoto = (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this, this));
        }
        //设置压缩规则,最大500kb
        takePhoto.onEnableCompress(new CompressConfig.Builder().setMaxSize(500 * 1024).create(), true);
        return takePhoto;
    }


    /**
     * 拍照,选取照片等操作
     */
    private void takePhotoAndImage() {
        //图片保存路径
        File file = new File(getExternalCacheDir(), System.currentTimeMillis() + ".png");
        Uri uri = Uri.fromFile(file);
        //图片裁剪方式
        int size = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);
        CropOptions cropOptions = new CropOptions.Builder().setOutputX(size).setOutputX(size).setWithOwnCrop(false).create();
        if (flag == 1) {
            //相机获取照片并剪裁
            takePhoto.onPickFromCaptureWithCrop(uri, cropOptions);
            //相机获取不剪裁
            //takePhoto.onPickFromCapture(uri);
        } else if (flag == 2) {
            //相册获取照片并剪裁
            takePhoto.onPickFromGalleryWithCrop(uri, cropOptions);
            //相册获取不剪裁
//      takePhoto.onPickFromGallery();
        } else if (flag == 3) {
            //多选,并剪裁
//            takePhoto.onPickMultipleWithCrop(3, cropOptions);
            //多选,不剪裁
            takePhoto.onPickMultiple(2);
        }
    }

    /**
     * 显示图片
     */
    private void showImg() {
        for (int i = 0, j = images.size(); i < j - 1; i += 2) {
            Glide.with(this).load(new File(images.get(i).getCompressPath())).into(ivChoose);
            Glide.with(this).load(new File(images.get(i + 1).getCompressPath())).into(ivChoose2);
        }
        if (images.size() % 2 == 1) {
            Glide.with(this).load(new File(images.get(images.size() - 1).getCompressPath())).into(ivChoose);
        }

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        getTakePhoto().onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        getTakePhoto().onSaveInstanceState(outState);
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PermissionManager.TPermissionType type = PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PermissionManager.handlePermissionsResult(this, type, invokeParam, this);
    }

    @Override
    public void takeSuccess(TResult result) {
        images = result.getImages();
        showImg();
    }

    @Override
    public void takeFail(TResult result, String msg) {
        Toast.makeText(CallPhone.this,"获取图片失败",Toast.LENGTH_SHORT).show();

    }

    @Override
    public void takeCancel() {
        Toast.makeText(CallPhone.this, "用户取消操作", Toast.LENGTH_SHORT).show();

    }

    @Override
    public PermissionManager.TPermissionType invoke(InvokeParam invokeParam) {
        PermissionManager.TPermissionType type = PermissionManager.checkPermission(TContextWrap.of(this), invokeParam.getMethod());
        if (PermissionManager.TPermissionType.WAIT.equals(type)) {
            this.invokeParam = invokeParam;
        }
        return type;
    }


    @OnClick({R.id.btn_photo, R.id.btn_picture, R.id.btn_multiple_choice})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_photo:
                flag = 1;
                takePhotoAndImage();
                break;
            case R.id.btn_picture:
                flag = 2;
                takePhotoAndImage();
                break;
            case R.id.btn_multiple_choice:
                flag = 3;
                takePhotoAndImage();
                break;
        }
    }
}

③实例图片

选取前
选取时

选取加载后

④Git地址

TakePhoto

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容