我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android应用如何获取相册中的图片

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android应用如何获取相册中的图片

这篇文章给大家介绍Android应用如何获取相册中的图片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

容易出错的地方:

当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量或者其他方式)然后设置给imageView

imageView.setImageURI(uri);

我发现手机前置摄像头拍出来的照片只有几百KB,直接用imageView.setImageURI(uri);没有很大问题,但是后置摄像头拍出来的照片比较大,这个时候使用imageView.setImageURI(uri);就容易出现 out of memory(oom)错误,我们需要先把URI转换为Bitmap,再压缩bitmap,然后通过imageView.setImageBitmap(bitmap);来显示图片。

将照片存放到SD卡中后,照片不能立即出现在系统相册中,因此我们需要发送广播去提醒相册更新照片。

这里用到了sharepreference,要注意用完之后移除缓存。

代码:

MainActivity:

package com.sctu.edu.test;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.ImageView;import com.sctu.edu.test.tools.ImageTools;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class MainActivity extends AppCompatActivity {  private static final int PHOTO_FROM_GALLERY = 1;  private static final int PHOTO_FROM_CAMERA = 2;  private ImageView imageView;  private File appDir;  private Uri uriForCamera;  private Date date;  private String str = "";  private SharePreference sharePreference;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    //Android不推荐使用全局变量,我在这里使用了sharePreference    sharePreference = SharePreference.getInstance(this);    imageView = (ImageView) findViewById(R.id.imageView);  }  //从相册取图片  public void gallery(View view) {    Intent intent = new Intent();    intent.setType("image    intent.putExtra(MediaStore.EXTRA_OUTPUT, uriForCamera);    startActivityForResult(intent, PHOTO_FROM_CAMERA);  }  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    //第一层switch    switch (requestCode) {      case PHOTO_FROM_GALLERY:        //第二层switch        switch (resultCode) {          case RESULT_OK:            if (data != null) {              Uri uri = data.getData();              imageView.setImageURI(uri);            }            break;          case RESULT_CANCELED:            break;        }        break;      case PHOTO_FROM_CAMERA:        if (resultCode == RESULT_OK) {          Uri uri = Uri.parse(sharePreference.getString("uri"));          updateDCIM(uri);          try {            //把URI转换为Bitmap,并将bitmap压缩,防止OOM(out of memory)            Bitmap bitmap = ImageTools.getBitmapFromUri(uri, this);            imageView.setImageBitmap(bitmap);          } catch (IOException e) {            e.printStackTrace();          }          removeCache("uri");        } else {          Log.e("result", "is not ok" + resultCode);        }        break;      default:        break;    }  }    private File createImageStoragePath() {    if (hasSdcard()) {      appDir = new File("/sdcard/testImage/");      if (!appDir.exists()) {        appDir.mkdirs();      }      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");      date = new Date();      str = simpleDateFormat.format(date);      String fileName = str + ".jpg";      File file = new File(appDir, fileName);      return file;    } else {      Log.e("sd", "is not load");      return null;    }  }      private void updateDCIM(Uri uri) {    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);    intent.setData(uri);    this.sendBroadcast(intent);    Bitmap bitmap = BitmapFactory.decodeFile(uri.getPath());    MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", "");  }    private boolean hasSdcard() {    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {      return true;    } else {      return false;    }  }    private void removeCache(String cache) {    if (sharePreference.ifHaveShare(cache)) {      sharePreference.removeOneCache(cache);    } else {      Log.e("this cache", "is not exist.");    }  }}

ImageTools:

package com.sctu.edu.test.tools;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;public class ImageTools {    public static Bitmap getBitmapFromUri(Uri uri, Activity activity) throws IOException {    InputStream inputStream = activity.getContentResolver().openInputStream(uri);    BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    options.inDither = true;    options.inPreferredConfig = Bitmap.Config.ARGB_8888;    BitmapFactory.decodeStream(inputStream, null, options);    inputStream.close();    int originalWidth = options.outWidth;    int originalHeight = options.outHeight;    if (originalWidth == -1 || originalHeight == -1) {      return null;    }    float height = 800f;    float width = 480f;    int be = 1; //be=1表示不缩放    if (originalWidth > originalHeight && originalWidth > width) {      be = (int) (originalWidth / width);    } else if (originalWidth < originalHeight && originalHeight > height) {      be = (int) (originalHeight / height);    }    if (be <= 0) {      be = 1;    }    BitmapFactory.Options bitmapOptinos = new BitmapFactory.Options();    bitmapOptinos.inSampleSize = be;    bitmapOptinos.inDither = true;    bitmapOptinos.inPreferredConfig = Bitmap.Config.ARGB_8888;    inputStream = activity.getContentResolver().openInputStream(uri);    Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, bitmapOptinos);    inputStream.close();    return compressImage(bitmap);  }    public static Bitmap compressImage(Bitmap bitmap) {    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);    int options = 100;    while (byteArrayOutputStream.toByteArray().length / 1024 > 100) {      byteArrayOutputStream.reset();      //第一个参数 :图片格式 ,第二个参数: 图片质量,100为最高,0为最差 ,第三个参数:保存压缩后的数据的流      bitmap.compress(Bitmap.CompressFormat.JPEG, options, byteArrayOutputStream);      options -= 10;    }    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());    Bitmap bitmapImage = BitmapFactory.decodeStream(byteArrayInputStream, null, null);    return bitmapImage;  }}

AndroidMainfest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest package="com.sctu.edu.test"   xmlns:android="http://schemas.android.com/apk/res/android"> <uses-feature  android:name="android.hardware.camera"  android:required="true"  /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="com.miui.whetstone.permission.ACCESS_PROVIDER"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera.autofocus" /> <application  android:allowBackup="true"  android:icon="@mipmap/ic_launcher"  android:label="@string/app_name"  android:supportsRtl="true"  android:theme="@style/AppTheme">  <activity android:name=".MainActivity">   <intent-filter>    <action android:name="android.intent.action.MAIN"/>    <category android:name="android.intent.category.LAUNCHER"/>   </intent-filter>  </activity> </application></manifest>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" android:background="#fff" android:orientation="vertical" tools:context="com.sctu.edu.test.MainActivity"> <Button  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="从图库找图片"  android:id="@+id/gallery"  android:onClick="gallery"  android:background="#ccc"  android:textSize="20sp"  android:padding="10dp"  android:layout_marginLeft="30dp"  android:layout_marginTop="40dp"  /> <Button  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="拍照获取图片"  android:id="@+id/camera"  android:onClick="camera"  android:background="#ccc"  android:textSize="20sp"  android:padding="10dp"  android:layout_marginLeft="30dp"  android:layout_marginTop="40dp"  /> <ImageView  android:layout_width="300dp"  android:layout_height="300dp"  android:id="@+id/imageView"  android:scaleType="fitXY"  android:background="@mipmap/ic_launcher"  android:layout_marginTop="40dp"  android:layout_marginLeft="30dp"  /></LinearLayout>

关于Android应用如何获取相册中的图片就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android应用如何获取相册中的图片

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android应用如何获取相册中的图片

这篇文章给大家介绍Android应用如何获取相册中的图片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。容易出错的地方:1、当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直
2023-05-31

如何在Android应用中利用phonegap实现从相册中获取图片

今天就跟大家聊聊有关如何在Android应用中利用phonegap实现从相册中获取图片,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体方法如下
2023-05-31

Android获取相册图片-实现选择相册图片功能

初识MediaProvider 需求:发朋友圈进行图片的选择,或者扫描二维码从图库选取。。。那么我们如何实现?这就需要借助媒体库的内容提供者MediaProvider,通过它,我们不仅可以读取图片,还可以读取视频,音频。 下面我们来看一下媒
2022-06-06

Android拍照和获取相册图片

之前遇到各种拍照啊,获取相册图片之类,都是直接去度娘,要么之前的代码复制下,没好好总结过。 再也不要问度娘了,再也不用一堆博客里找啊找了。。。 ----------------------------------------------我是
2022-06-06

Android获取本地相册图片和拍照获取图片的实现方法

需求:从本地相册找图片,或通过调用系统相机拍照得到图片。 容易出错的地方: 1、当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量或者其他方式)然后设置给imageVie
2022-06-06

Android开发从相机或相册获取图片裁剪

废话不多说了,直接给大家贴代码了。package com.only.android.app; import java.io.File; import android.app.Activity; import android.app.Aler
2022-06-06

android中打开相机、打开相册进行图片的获取示例

这里介绍在Android中实现相机调取、拍照片、获取照片、存储新路径等已经打开相册、选择照片等功能首先看一下界面,很简单配置读取内存卡和调用照相头的功能
2022-06-06

android获取相册图片和路径的实现方法

Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题。 比如:managedQuery()现在已经被getConte
2022-06-06

android通过访问相册获取图片并展示在ImageView中

第一步:添加相应的权限以及属性; ①在manifest中设置权限②在中设置相应属性,这一步很关键,解决了我在这一方面最后的一个有关deny的权限问题 android:requestLegacyExternalStorage="true"
2022-06-06

利用Android如何获取sdcard中的图片

利用Android如何获取sdcard中的图片?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、首先你要在AndroidManifest.xml申请读取sdca
2023-05-31

解决Android从相册中获取图片出错图片却无法裁剪问题的方法

在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验。 问题: 选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)手机提示“此图片无法获取”,经百度后,明白是版本不同导致的URI的问题的
2022-06-06

Android 应用中怎么获取手机里的图片

本篇文章给大家分享的是有关Android 应用中怎么获取手机里的图片,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android 实现获取手机里面的所有图片详解及实例实现代码:
2023-05-31

Android应用中怎么将图片保存到本地相册

这篇文章将为大家详细讲解有关Android应用中怎么将图片保存到本地相册,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先是保存图片到本地private static final Strin
2023-05-31

android跳到系统相册选择图片并根据uri获取真实图片路径

1.首先跳转到系统相册选择图片 public void ChoosePicture(View view){// 激活系统图库,选择一张图片Intent intent = new Intent();intent.setAction(Inten
2022-06-06

怎么在android中实现拍从相册中选取图片

这篇文章将为大家详细讲解有关怎么在android中实现拍从相册中选取图片,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。获取图片方式: (类似更换头像的效果)1、手机拍照 选择图片;2、相册选
2023-06-14

使用Android怎么从相册中选取照片

使用Android怎么从相册中选取照片?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)直接选择相册后返回第一步就是主要跳转的相册 //在这里跳转到手机系统相
2023-05-30

jquery中如何获取图片

本文详细介绍了jQuery获取图像的方法:获取图像元素获取图像属性,例如源URL和替代文本设置图像属性,例如源URL和尺寸获取图像大小(宽度和高度)隐藏和显示图像获取和存储图像数据修改图像样式
jquery中如何获取图片
2024-04-02

Android使用phonegap从相册里面获取照片(代码分享)

话不多说,请看代码: Take a Photo