Android--从系统Gallery获取图片

简介:

前言

  在Android应用中,经常有场景会需要使用到设备上存储的图片,而直接从路径中获取无疑是非常不便利的。所以一般推荐调用系统的Gallery应用,选择图片,然后使用它。本篇博客将讲解如何在Android中通过系统Gallery获取图片。

 

Gallery应用

  Android原生内置了很多App,而Gallery为图库,用于操作设备上的图片,它会在开机的时候主动扫描设备上存储的图片,并可以使用Gallery操作它们。既然要使用Gallery,那么先看看它的AndroidManifest.xml清单文件。

复制代码
 1         <activity android:name="com.android.camera.ImageGallery"
 2                 android:label="@string/gallery_label"
 3                 android:configChanges="orientation|keyboardHidden"
 4                 android:icon="@drawable/ic_launcher_gallery">
 5             <intent-filter>
 6                 <action android:name="android.intent.action.MAIN" />
 7                 <category android:name="android.intent.category.DEFAULT" />
 8             </intent-filter>
 9             <intent-filter>
10                 <action android:name="android.intent.action.VIEW" />
11                 <category android:name="android.intent.category.DEFAULT" />
12                 <data android:mimeType="vnd.android.cursor.dir/image" />
13             </intent-filter>
14             <intent-filter>
15                 <action android:name="android.intent.action.VIEW" />
16                 <category android:name="android.intent.category.DEFAULT" />
17                 <data android:mimeType="vnd.android.cursor.dir/video" />
18             </intent-filter>
19             <intent-filter>
20                 <action android:name="android.intent.action.GET_CONTENT" />
21                 <category android:name="android.intent.category.OPENABLE" />
22                 <data android:mimeType="vnd.android.cursor.dir/image" />
23             </intent-filter>
24             <intent-filter>
25                 <action android:name="android.intent.action.GET_CONTENT" />
26                 <category android:name="android.intent.category.OPENABLE" />
27                 <category android:name="android.intent.category.DEFAULT" />
28                 <data android:mimeType="image/*" />
29                 <data android:mimeType="video/*" />
30             </intent-filter>
31             <intent-filter>
32                 <action android:name="android.intent.action.PICK" />
33                 <category android:name="android.intent.category.DEFAULT" />
34                 <data android:mimeType="image/*" />
35                 <data android:mimeType="video/*" />
36             </intent-filter>
37             <intent-filter>
38                 <action android:name="android.intent.action.PICK" />
39                 <category android:name="android.intent.category.DEFAULT" />
40                 <data android:mimeType="vnd.android.cursor.dir/image" />
41             </intent-filter>
42         </activity>
复制代码

  上面是Gallery的AndroidManifest.xml文件中的部分代码,展示了ImageGallery,从众多Intent-filter中可以看出,选取图片应该使用"android.intent.action.PICK",它有两个miniType,"image/*"是用来获取图片的、"video/*"是用来获取视频的。Android中众多Action的字符串其实被封装在Intent类中,android.intent.action.PICK也不例外,它是Intent.ACTION_PICK。

  既然知道了启动Gallery的Action,那么再看看ImageGallery.java的源码,找找其中选中图片后的返回值。

复制代码
 1     private void launchCropperOrFinish(IImage img) {
 2         Bundle myExtras = getIntent().getExtras();
 3 
 4         long size = MenuHelper.getImageFileSize(img);
 5         if (size < 0) {
 6             // Return if the image file is not available.
 7             return;
 8         }
 9 
10         if (size > mVideoSizeLimit) {
11             DialogInterface.OnClickListener buttonListener =
12                     new DialogInterface.OnClickListener() {
13                 public void onClick(DialogInterface dialog, int which) {
14                     dialog.dismiss();
15                 }
16             };
17             new AlertDialog.Builder(this)
18                     .setIcon(android.R.drawable.ic_dialog_info)
19                     .setTitle(R.string.file_info_title)
20                     .setMessage(R.string.video_exceed_mms_limit)
21                     .setNeutralButton(R.string.details_ok, buttonListener)
22                     .show();
23             return;
24         }
25 
26         String cropValue = myExtras != null ? myExtras.getString("crop") : null;
27         if (cropValue != null) {
28             Bundle newExtras = new Bundle();
29             if (cropValue.equals("circle")) {
30                 newExtras.putString("circleCrop", "true");
31             }
32 
33             Intent cropIntent = new Intent();
34             cropIntent.setData(img.fullSizeImageUri());
35             cropIntent.setClass(this, CropImage.class);
36             cropIntent.putExtras(newExtras);
37 
38             /* pass through any extras that were passed in */
39             cropIntent.putExtras(myExtras);
40             startActivityForResult(cropIntent, CROP_MSG);
41         } else {
42             Intent result = new Intent(null, img.fullSizeImageUri());
43             if (myExtras != null && myExtras.getBoolean("return-data")) {
44                 // The size of a transaction should be below 100K.
45                 Bitmap bitmap = img.fullSizeBitmap(
46                         IImage.UNCONSTRAINED, 100 * 1024);
47                 if (bitmap != null) {
48                     result.putExtra("data", bitmap);
49                 }
50             }
51             setResult(RESULT_OK, result);
52             finish();
53         }
54     }
复制代码

  以上的ImageGallery.java的部分源码,从setResult()方法可以看出,它返回的Intent包含了选中图片的Uri,它是一个content://开头的内容提供者,并且如果传递过去的Intent的Extra中,包含一个name为"return-data"并且值为true的时候,还会往Extra中写入name为"data"的图片缩略图。

 

Gallery获取图片Demo

  既然已经知道了启动Gallery的Action,和它如何返回选中的数据,那么接下来通过一个简单的Demo来演示一下如何从系统Gallery中获取图片,并把获取到的图片展示到界面的一个ImageView中。

复制代码
 1 package cn.bgxt.sysgallerydemo;
 2 
 3 import android.net.Uri;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 import android.widget.ImageView;
10 import android.app.Activity;
11 import android.content.Intent;
12 
13 public class MainActivity extends Activity {
14     private Button btn_getImage;
15     private ImageView iv_image;
16     private final static String TAG = "main";
17 
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22 
23         btn_getImage = (Button) findViewById(R.id.btn_getImage);
24         iv_image = (ImageView) findViewById(R.id.iv_image);
25 
26         btn_getImage.setOnClickListener(getImage);
27     }
28 
29     private View.OnClickListener getImage = new OnClickListener() {
30 
31         @Override
32         public void onClick(View v) {
33             // 设定action和miniType
34             Intent intent = new Intent();
35             intent.setAction(Intent.ACTION_PICK);
36             intent.setType("image/*");
37             // 以需要返回值的模式开启一个Activity
38             startActivityForResult(intent, 0);
39         }
40     };
41 
42     @Override
43     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
44         // 如果获取成功,resultCode为-1
45         Log.i(TAG, "resultCode:" + resultCode);
46         if (requestCode == 0 && resultCode == -1) {
47             // 获取原图的Uri,它是一个内容提供者
48             Uri uri = data.getData();
49             iv_image.setImageURI(uri);
50         }
51         super.onActivityResult(requestCode, resultCode, data);
52     }
53 }
复制代码

  效果展示:

 

  源码下载

 

总结

  本篇博客到这里就基本上讲解了如何在Android下调用系统Gallery获取图片,其实功能实现很简单,主要是要注意Action和miniType不要写错了,并且返回值是一个Uri。虽然现在越来越多需要用到图片的商业应用,都在自己开发获取设备图片的功能,但是使用系统自带的Gallery来获取不失为一种快速实现功能的解决办法。为了方便起见,系统的Gallery源码,也会一并打包放到源码中,有需要的可以下载来看看。


本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_SysGallery.html,如需转载请自行联系原作者


相关文章
|
3月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
239 6
|
3月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
7月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
311 3
Android利用selector(选择器)实现图片动态点击效果
|
7月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
238 8
|
7月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
283 1
|
8月前
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
268 18
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
Android开发 数据格式 XML
Android异步加载图片详解之方式二(3)
main.xml如下:   listviewitem.xml如下:   ...
863 0
|
缓存 Java Android开发
Android异步加载图片详解之方式二(2)
FileCache.java如下: package com.cn.loadImages; import java.io.File; import java.
957 0
|
Android开发
Android异步加载图片详解之方式二(1)
MainActivity.java如下: package com.cn.perfectlistview; import java.util.ArrayList; import android.
954 0

热门文章

最新文章