Android---打开相册选择图片

这篇具有很好参考价值的文章主要介绍了Android---打开相册选择图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android打开相册选择图片,Android,android

简单实现打开系统相册选择一张图片并显示在UI上,适用与个人主页头像的切换。

1. 添加存储权限。AndroidManifest.xml里添加读取内存的权限。

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

2. 布局。布局内容比较交单,一个Button用来打开相册;一个ImageView用来接收从相册选择的图片。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_open_gallery"
        android:layout_width="150dp"
        android:layout_height="75dp"
        android:layout_centerHorizontal="true"
        android:text="打开相册"
        android:textSize="20sp"/>
    
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/btn_open_gallery"/>
    
</RelativeLayout>

3. 动态申请权限。Google 在 Android 6.0 开始引入了权限申请机制,除了再AndroidManifest.xml里申请静态权限,还需要在代码里动态申请。

/**
* 申请动态权限
*/
private void applyPermission() {
    //检测权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 如果没有权限,则申请需要的权限
        ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }else {
        // 已经申请了权限
        openGallery();
    }
}

4. 申请权限的回调。

    /**
     * 用户选择是否开启权限操作后的回调;TODO 同意/拒绝
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同样授权
                openGallery();
            }else {
                // 用户拒绝授权
                Toast.makeText(this, "你拒绝使用存储权限!", Toast.LENGTH_SHORT).show();
                Log.d("HL", "你拒绝使用存储权限!");
            }
        }
    }

5. 打开相册。

    /**
     * 打开相册
     */
    private void openGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , "image/*");
        startActivityForResult(intent, OPEN_GALLERY_REQUEST_CODE);
    }

6. 结果回调。用户选择了一张图片,接收返回的结果并在ImageView里显示。、

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == OPEN_GALLERY_REQUEST_CODE) { // 检测请求码
            if (resultCode == Activity.RESULT_OK && data != null) {
                try {
                    InputStream inputStream = getContentResolver().openInputStream(data.getData());
                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    // TODO 把获取到的图片放到ImageView上
                    mImg.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

完整Demo文章来源地址https://www.toymoban.com/news/detail-776486.html

package com.example.opengallery;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 0;
    private static final int OPEN_GALLERY_REQUEST_CODE = 1;
    private static final int TAKE_PHOTO_REQUEST_CODE = 2;

    private Button mOpenGallery;
    private ImageView mImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mOpenGallery = findViewById(R.id.btn_open_gallery);
        mImg = findViewById(R.id.img);

        //打开相册
        mOpenGallery.setOnClickListener(v -> {
            applyPermission();
        });

    }

    /**
     * 申请动态权限
     */
    private void applyPermission() {
        //检测权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 如果没有权限,则申请需要的权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
        }else {
            // 已经申请了权限
            openGallery();
        }
    }

    /**
     * 用户选择是否开启权限操作后的回调;TODO 同意/拒绝
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同样授权
                openGallery();
            }else {
                // 用户拒绝授权
                Toast.makeText(this, "你拒绝使用存储权限!", Toast.LENGTH_SHORT).show();
                Log.d("HL", "你拒绝使用存储权限!");
            }
        }
    }

    /**
     * 打开相册
     */
    private void openGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , "image/*");
        startActivityForResult(intent, OPEN_GALLERY_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == OPEN_GALLERY_REQUEST_CODE) { // 检测请求码
            if (resultCode == Activity.RESULT_OK && data != null) {
                try {
                    InputStream inputStream = getContentResolver().openInputStream(data.getData());
                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    // TODO 把获取到的图片放到ImageView上
                    mImg.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

到了这里,关于Android---打开相册选择图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

    当使用了 AndroidX 后,发现 `startActivityForResult()` 标记为过时了,而是推荐我们使用 `registerForActivityResult()` 函数。 `registerForActivityResult()` 函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Activity 和 Fragment 之间进行启动其他 Activity 并接收结果的过程

    2024年02月08日
    浏览(50)
  • Android权限申请库——EasyPermissions使用详解和打开相册方法

    1、添加依赖 2、在AndroidManifest文件中添加需要的权限 3、复写onRequestPermissionsResult方法 4、检查权限 5、申请权限 6、实现EasyPermissions.PermissionCallbacks接口,处理申请结果

    2024年02月15日
    浏览(38)
  • Android保存图片到相册,兼容Android10及以上版本

    Android 共享存储空间 访问共享存储空间中的媒体文件 MediaStore是android系统提供的一个多媒体数据库,专门用于存放多媒体信息的,通过ContentResolver即可对数据库进行操作。 MediaStore.Files: 共享的文件,包括多媒体和非多媒体信息; MediaStore.Audio: 存放音频信息; MediaStore.Image: 存放

    2024年02月11日
    浏览(50)
  • android 11及以上保存图片视频到相册

    Android 10之前版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 复制到系统相册目录下 扫描媒体库 Android 10及以上版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 创建ContentValues,写入要保存的信息 调用ContentResolver插入

    2024年02月11日
    浏览(41)
  • Android webview上传图片(调起相册/相机上传)

    概述 默认情况 WebView 不支持input type=file,WebView 点击没有反应。 兼容 重写 webview 的 webchromeClient 中的 openFileChooser 方法。Android 版本的多样性,就理所当然的各种兼容。 具体代码实现 网上也有很多实现方式,这边记录一下自己用到的一种 webview 调用时,弹出本地弹框,选择(

    2023年04月21日
    浏览(39)
  • Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

           在项目研发中,相信大家都遇到过给用户增加 头像照片 的需求。        随着 手机版本的不断更新 ,android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等;遇到这个功能需求,大家肯定会想, “这还不好写? 之前就已经写过了。” 把老项目跑了一遍

    2024年02月01日
    浏览(51)
  • Android实战场景 - 保存WebView中的图片到相册

    去年同事写了一个 “在H5中保存图片到相册” 的功能,虽然有大致实现思路,实现起来也没问题,但是感觉同事考虑问题的很周全,当时候就想着去学习一下,但是项目太赶没顾得上,索性现在有时间,准备好好学习一下 我那些关于WebView的回忆 ~ 包含入门使用、优化加载样

    2023年04月09日
    浏览(41)
  • Android保存图片到系统图库并通知系统相册刷新

      在android开发中保存应用的图片并插入到系统图库同时通知相册刷新的功能,做完后发现在部分手机上出现虽然图片保存成功了,但是相册却找不到图片的问题,查找文件夹图片也已经存在,可就是在相册里刷新不出来。   以上代码便是将Bitmap保存图片到指定的路径/

    2024年01月24日
    浏览(39)
  • Android实现保存res下(drawable/mipmap)的图片到手机相册

    项目小需求需要保存二维码名片到手机相册的需求,该图片在res/mipmap或者res/drawable文件夹下,实现方法如下。 代码如下(示例): 代码如下(示例): 以上就是今天要讲的内容,本文仅仅简单介绍了在res/mipmap或者res/drawable文件夹下图片保存到手机相册的方法。

    2024年02月12日
    浏览(56)
  • Android之抓取短信,所有应用信息,通讯录,通话记录,手机系统相册图片

    一般我们做金融APP会遇到风控需求,需要获取用户手机短信,手机所有安装应用信息,通讯录,通话记录等功能,接下来我们看看怎么做,一篇文章解决所有! 这里我只需要这些字段,需要更多自己添加 1.kotlin 2.java 1.kotlin 2.Java 1.kotlin 2.Java 这篇文章比较长,懒得分开成几篇

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包