Android 访问系统相册选中图片,并返回该图片的路径

Posted 路宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 访问系统相册选中图片,并返回该图片的路径相关的知识,希望对你有一定的参考价值。

前言:

简单写一个按钮,点击按钮访问相册,首先在androidManifest.xml清单文件中加入从外部读取文件的权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

之后在MainActivity中实现所述功能,具体注释已经在代码中给出

btn_picture.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
            	//动态申请权限
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]Manifest.permission.READ_EXTERNAL_STORAGE, 1);
                 else 
                    //访问相册
                    InputPicture();
                
            
        );


 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
        if (requestCode == 1) 
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                InputPicture();
             else 
                Toast.makeText(this, "你拒绝打开此权限,无法进行下一步操作!", Toast.LENGTH_SHORT).show();
            
        
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    

    private void InputPicture() 
    	//Intent.ACTION_PICK 从数据中选择一个项目 (item),将被选中的项目返回。
    	//MediaStore.Images.Media.EXTERNAL_CONTENT_URI 获取外部的URI
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    	//参数一:对应的数据的URI 参数二:使用该函数表示要查找文件的MIME类型	
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, 1);
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
        if (requestCode == 1 && 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);
            Log.e("TAG", "onActivityResult: " + picturePath );
        
        super.onActivityResult(requestCode, resultCode, data);

    

分析ContentResolver().query()方法中接收的这四个参数的含义:

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);

Android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接利用ContentResolver去调用那些封装好的接口就可以进行数据库的操作了。
这里我们进行查询操作,这四个参数的具体含义如下:

  1. Uri uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有图片的信息,就可以利用MediaStore.Images.Media.EXTERNAL_CONTENT_URI的这个Uri,其他查询也都类似。
  2. String[] projection:这个参数代表要从表中选择的列,用一个String数组来表示。
  3. String selection:相当于SQL语句中的where子句,就是代表你的查询条件。
  4. String[] selectArgs:这个参数是说你的selection里有?这个符号,这里可以以实际值代替这个问号。如果selection这个没有?问号,那么这个String[]可以写为null。
  5. String sortOrder:说明查询结果按什么来排序,默认是升序排列,你也可以设置为降序DESC。

点击按钮打开后的效果图如下:


之后返回的路径为:

onActivityResult:/storage/emulated/0/test.png

以上是关于Android 访问系统相册选中图片,并返回该图片的路径的主要内容,如果未能解决你的问题,请参考以下文章

Android辅助H5做一个Web版的相册功能

Android_5_学习《第一行代码》的使用摄像头和相册无法显示图片问题解决

android将应用中图片保存到系统相册并显示

Android拍照,相册选择图片以及Android6.0权限管理

Android 图片存入系统相册更新显示实例详解

Android中拍照(相册中选择)并上传图片功能(包括动态获取权限)