获取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)
}
}```
本文介绍如何在Android应用中获取读取外部存储权限,使用RecyclerView展示相册图片,包括动态请求权限和使用Glide加载图片的过程。

7206

被折叠的 条评论
为什么被折叠?



