Android获取系统相册图片选中地址,获取手机中的所有图片地址自定义相册

news/2024/11/16 11:33:52/

一、获取手机中的值

1.首先在使用读写sd卡权限

2.获取手机中的所有图片:

注意代码中的getGalleryPhotos(getContentResolver()) 方法获取所有地址

获取所有图片地址后使用recycleview 组件构建自定义相册,recycleview的使用方式我就不多说了自己百度

private void initAbbreviation() {//if语句 没有读写SD卡的权限,就申请权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {//获取所有图片存入list集合 getGalleryPhotos方法allPath = new ArrayList<>();allPath = getGalleryPhotos(getContentResolver());Log.d("tgw所有图片地址", "initAbbreviation: " + allPath.toString());//取出首张图片if (allPath != null && !allPath.isEmpty()) {picturePath = allPath.get(0);}}}
//获取所有图片存入list集合返回,MediaStore.Images.Media.DATA中的Imagespublic static ArrayList<String> getGalleryPhotos(ContentResolver resolver) {ArrayList<String> galleryList = new ArrayList<String>();try {//获取所在相册和相册idfinal String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};//按照id排序final String orderBy = MediaStore.Images.Media._ID;//相当于sql语句默认升序排序orderBy,如果降序则最后一位参数是是orderBy+" desc "Cursor imagecursor =resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,null, orderBy);//从数据库中取出图存入list集合中if (imagecursor != null && imagecursor.getCount() > 0) {while (imagecursor.moveToNext()) {int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
//                    Log.d("tgw7", "getGalleryPhotos: " + dataColumnIndex);String path = "file://" + imagecursor.getString(dataColumnIndex);Log.d("tgw5", "getGalleryPhotos: " + path);galleryList.add(path);}}} catch (Exception e) {e.printStackTrace();}// 进行反转集合Collections.reverse(galleryList);return galleryList;}

二、获取系统相册中选中图片的值

1.首先开启系统相册---SELECT_PHOTO是一个请求值  用于onActivityResult 方法中判断由谁发出请求

  //2.0 开启系统相册 //浏览照片---看 onActivityResult 的返回方法Intent intent = new Intent("android.intent.action.GET_CONTENT");intent.setType("image/*");startActivityForResult(intent, SELECT_PHOTO);

2.onActivityResult  获取选中的图片返回值,关注下面的getRealPathFromUri(this, data.getData()); 方法它是获取选中图片的关键

 //先判断图片类型在 获取指定的图片序号,在根据指定的id序号使用Cursor查询得到图片地址@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);//外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口ContentResolver resolver = getContentResolver();switch (requestCode) {case SELECT_PHOTO:if (resultCode == RESULT_OK) {//先判断图片类型在 获取指定的图片序号,在根据指定的id序号使用Cursor查询得到图片地址if (data != null) {selectPicturePath = getRealPathFromUri(this, data.getData());Log.d("tgw", "onActivityResult: " + selectPicturePath + "--" + data.getData());imageLoader.displayImage(selectPicturePath,ivLoad3,options);} else {Toast.makeText(this, "图片损坏,请重新选择", Toast.LENGTH_SHORT).show();}//                    //打开系统相册,但是返回值为空
//                    try {
//                        Uri imageUri = data.getData();        //获得图片的uri
//                        picturePathBitmap = MediaStore.Images.Media.getBitmap(resolver, imageUri);
//                        String[] proj = {MediaStore.Images.Media.DATA};
//
//                        //好像是android多媒体数据库的封装接口,具体的看Android文档
//                        Cursor cursor = managedQuery(imageUri, proj, null, null, null);
//
//                        //按我个人理解 这个是获得用户选择的图片的索引值
//                        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
//
//                        //将光标移至开头 ,这个很重要,不小心很容易引起越界
//                        cursor.moveToFirst();
//
//                        //最后根据索引值获取图片路径
//                        picturePath = cursor.getString(column_index);
//                        Log.d("tgw3", "onActivityResult: " + picturePath);
//
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                    }
//                    Log.d("tgw3", "onActivityResult: " + requestCode + "---" + resultCode);
//
//                } else {
//                    Log.d("tgw4", "onActivityResult: " + requestCode + "---" + resultCode);}break;default:break;}}

3.getRealPathFromUri(this, data.getData());方法如下所示

其中值得我们注意的是API的大小

API>19 我们需要根据图片类型进行不同的查询

API<19 关注getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) 方法

//获取选择的图片地址private String getRealPathFromUri(MainActivity mAct, Uri uri) {Log.d("tgw", "getRealPathFromUri:uri.getScheme() " + uri.getScheme());if (Build.VERSION.SDK_INT >= 19) { // api >= 19  如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回nullString filePath = null;//判断该Uri是否是document封装过的DocumentsContract.isDocumentUri(mAct, uri)if (DocumentsContract.isDocumentUri(mAct, uri)) {// 如果是document类型的 uri, 则通过document id来进行处理String documentId = DocumentsContract.getDocumentId(uri);if ("com.android.providers.media.documents".equals(uri.getAuthority())) { // MediaProvider// 使用':'分割用split('.')方法将字符串以"."开割形成一个字符串数组,// 然后再通过索引[1]取出所得数组中的第二个元素的值。String id = documentId.split(":")[1];Log.d("tgw1", "getRealPathFromUri: " + documentId + "--" + id);String selection = MediaStore.Images.Media._ID + "=?";String[] selectionArgs = {id};//如果要查询图片,地址:MediaStore.Images.Media.EXTERNAL_CONTENT_URIfilePath = getDataColumn(mAct, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);Log.d("tgwdocuments", "getRealPathFromUri: " + filePath + "==" + selectionArgs);} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) { // DownloadsProvider//这个方法负责把id和contentUri连接成一个新的Uri=: content://downloads/public_downloads/documentIdUri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));filePath = getDataColumn(mAct, contentUri, null, null);Log.d("tgwcontentUri", "getRealPathFromUri: " + filePath);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {// 如果是 content 类型的 Uri// 返回文件头 uri.getScheme() 如:content  file 等等filePath = getDataColumn(mAct, uri, null, null);Log.d("tgwcontent", "getRealPathFromUri: " + filePath);} else if ("file".equals(uri.getScheme())) {// 如果是 file 类型的 Uri,直接获取图片对应的路径filePath = uri.getPath();Log.d("tgwfile", "getRealPathFromUri: " + filePath);}return filePath;} else { // api < 19return getDataColumn(mAct, uri, null, null);}}

4.获取选到图片数据的地址:

getDataColumn 方法:

 private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {String path = null;String[] projection = new String[]{MediaStore.Images.Media.DATA};Cursor cursor = null;try {//uri提供内容的地址,projection查询要返回的列,// selection  :查询where字句, selectionArgs : 查询条件属性值 ,sortOrder :结果排序规则cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {//getColumnIndexOrThrow 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);path = cursor.getString(columnIndex);Log.d("tgwgetDataColumn", "getDataColumn: " + path);}} catch (Exception e) {if (cursor != null) {cursor.close();}}//  "file://" 图片地址要加上file头return "file://" + path;}

 

 

Android获取手机中的所有音乐地址:

https://blog.csdn.net/TGWhuli/article/details/97760172

 


http://www.ppmy.cn/news/788627.html

相关文章

vue中使用require动态获取图片地址

项目场景&#xff1a; 项目中根据图片不同的后缀名&#xff0c;展示不同的图片 问题描述 直接给图片的src绑定图片地址&#xff0c;图片不显示&#xff0c;使用 require(图片本地路径 地址变量 .png) 也不显示 <img :src"require(/assets/img/ item.url .png)&qu…

Java获取图片像素点数组数据

方式一&#xff1a; //方式一&#xff1a;通过getRGB()方式获得像素矩阵 public static void getPicArrayData(String path){try{BufferedImage bimg ImageIO.read(new File(path));int [][] data new int[bimg.getWidth()][bimg.getHeight()];for(int i0;i<bimg.getWidt…

Vue——如何获取动态图片地址

问题 当我们在Vue页面显示当前登录用户的头像时&#xff0c;该如何加载后端传过来的动态图片地址呢&#xff1f; 这时是固定地址&#xff0c;第一时间我们想到直接在src前加:&#xff0c;使用vue的双向数据绑定即可&#xff0c;但是试了多次没有效果&#xff0c;原来要加requ…

根据ip获取地址

php 根据ip获取地址 js方法获取用户的 ip 和 地址 获取用户的来源&#xff1a;$_SERVER[‘HTTP_REFERER’] 获取用户的 IP&#xff1a;$ip $_SERVER[“REMOTE_ADDR”]; 获取用户的地址&#xff1a; 1 > 使用淘宝API接口 function getCity(KaTeX parse error: Expecte…

js通过图片url获取图片base64编码

方法1&#xff1a;直接返回图片编码 参数url&#xff1a;图片的路径 &#xff1b;参数imgType&#xff1a;图片类型默认image/png&#xff1b;方法返回值&#xff1a;图片base64编码 function getBase64ImageUrl(url, imgType) {if(!imgType){imgType"image/png";}…

vue 组件中图片地址,图片获取

前提&#xff1a;在组件中使用引用图片&#xff0c;用于<img src> 或者 背景图片background; 当我们利用vue-cli 搭建好项目的框架&#xff0c;开始高高兴兴开发组件的时候&#xff0c;有的时候想加一张图片&#xff0c;或者 在样式中加个背景&#xff0c;会发现&…

vue从数据库获取图片地址,为什么图片地址为变量时找不到图片?

vue展示以变量地址的文件 vue新手 刚开始学习vue的同学&#xff0c;可能会遇到一个问题&#xff0c;为什么当图片的地址为一个变量的时候&#xff0c;图片就找不到了呢&#xff1f; 接下来我就讲述一下我的解决方法&#xff0c;及思路。 首先&#xff0c;我们打开浏览器&am…

Android根据图片路径获取图片名字

public static String getPicNameFromPath(String picturePath){String temp[] picturePath.replaceAll("\\\\","/").split("/");String fileName "";if(temp.length > 1){fileName temp[temp.length - 1];}return fileName;}