获取Android相册图片

本文介绍如何在Android应用中获取读取外部存储权限,使用RecyclerView展示相册图片,包括动态请求权限和使用Glide加载图片的过程。

获取Android相册图片
一.获取系统权限
首先我们需要在AndroidManifest中声明权限:


```java
    <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" />

因为这个为Android的危险权限所以需要在代码中动态申请:

        //查看权限是否申明
        if(ContextCompat.checkSelfPermission(this,android.Manifest.permission.READ_EXTERNAL_STORAGE)
            !=PackageManager.PERMISSION_GRANTED){
            //申请权限
            ActivityCompat.requestPermissions(this,arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),1)
        }else{
//            readContacts()
            readPhoto()
        }
    //在申请权限调用ActivityCompat.requestPermissions后会回调onRequestPermissionsResult来实现逻辑
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode){
            1->{
                if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//                    readContacts()
                    readPhoto()
                }else{
                    Toast.makeText(this,"你未申请权限!",Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

二.本次中采用RecycleView来展示图片

<?xml version="1.0" encoding="utf-8"?>
//MainActivity的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
<!--    <ListView-->
<!--        android:id="@+id/listview"-->
<!--        android:layout_width="wrap_content"-->
<!--        android:layout_height="wrap_content"/>-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

子项布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="50dp"/>
</LinearLayout>

三.获取图片以及主activity的代码全部奉上
代码中的readContacts()函数以及注释部分的代码可不用管,是获取联系人的代码。

package com.example.contentprovidertest

import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.provider.ContactsContract
import android.provider.MediaStore
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.concurrent.thread
import kotlin.math.log

class MainActivity : AppCompatActivity() {
    private val dataList=ArrayList<String>()
    private var photoList = ArrayList<String>()
    private lateinit var adapter: ArrayAdapter<String>
    private lateinit var recyclerAdapter: RecyclerAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
//        adapter= ArrayAdapter(this,android.R.layout.simple_list_item_1,dataList)
//        listview.adapter=adapter
        recyclerAdapter = RecyclerAdapter(photoList)
        recycler_view.adapter = recyclerAdapter
        val layoutManager = StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL)
        recycler_view.layoutManager = layoutManager
        //查看权限是否申明
        if(ContextCompat.checkSelfPermission(this,android.Manifest.permission.READ_EXTERNAL_STORAGE)
            !=PackageManager.PERMISSION_GRANTED){
            //申请权限
            ActivityCompat.requestPermissions(this,arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),1)
        }else{
//            readContacts()
            readPhoto()
        }
    }

    @SuppressLint("Range", "NotifyDataSetChanged")
    private fun readPhoto() {
        thread {
            val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            val arr: Array<String> = arrayOf(
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DATA,
                MediaStore.Images.Media.SIZE,
                MediaStore.Images.Media.DISPLAY_NAME
            )
            contentResolver.query(uri, arr, null, null, null).apply {
                while (moveToNext()) {
                    var path = getString(getColumnIndex(MediaStore.Images.Media.DATA))
                    var size = getInt(getColumnIndex(MediaStore.Images.Media.SIZE))
                    var name = getInt(getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))
                    Log.d("MyMainActivity", "readPhoto: path = $path")
                    photoList.add(path)
                }
                recyclerAdapter.notifyDataSetChanged()
                Log.d("TAG", "readPhoto: ${recyclerAdapter.itemCount}")
                close()
            }
        }
    }

    //在申请权限调用ActivityCompat.requestPermissions后会回调onRequestPermissionsResult来实现逻辑
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode){
            1->{
                if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//                    readContacts()
                    readPhoto()
                }else{
                    Toast.makeText(this,"你未申请权限!",Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    @SuppressLint("Range")
    private fun readContacts() {
        contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,null,null,null)?.apply {
                while (moveToNext()){
                    val name=getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                    val number=getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                    dataList.add("$name\n$number")
                }
            adapter.notifyDataSetChanged()
            close()
        }
    }
}

四.获取全局的Context

package com.example.contentprovidertest

import android.app.Application
import android.content.Context

class MyApplication: Application() {
    companion object {
        lateinit var mContext: Context
    }

    override fun onCreate() {
        super.onCreate()
        mContext = applicationContext
    }
}

五.RecyclerAdapter

package com.example.contentprovidertest

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide

class RecyclerAdapter(var photoList: List<String>):
    RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val img: ImageView = view.findViewById<ImageView>(R.id.img)
    }

    override fun getItemCount(): Int {
        return photoList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.recycle_view_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val photoPath = photoList[position]
        Glide.with(MyApplication.mContext).load(photoPath).into(holder.img)
    }
}```

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值