android: 从相册中选择照片
虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的。 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用。一个优秀的应用程序应该将这两种选择方式都提供给 用户,由用户来决定使用哪一种。下面我们就来看一下,如何才能实现从相册中选择照片的 功能。
还是在 ChoosePicTest 项目的基础上进行修改,首先编辑 activity_main.xml 文件,在布局 中添加一个按钮用于从相册中选择照片,代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical" >
<Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo" />
<Button android:id="@+id/choose_from_album" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Choose From Album" />
<ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" />
</LinearLayout>
然后修改 MainActivity 中的代码,加入从相册选择照片的逻辑,代码如下所示:
public class MainActivity extends Activity {
……
private Button chooseFromAlbum;
@Override
protected void
onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
……
chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
chooseFromAlbum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 创建File对象,用于存储选择的照片
File outputImage = new
File(Environment. getExternalStorageDirectory(), "output_image.jpg");
try {
if (outputImage.exists())
{
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent("android.intent.action.
intent.setType("image/*");
intent.putExtra("crop", true);
intent.putExtra("scale",
true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CROP_PHOTO);
});
}
……
}
可以看到,在 Choose From Album 按钮的点击事件里我们同样创建了一个 File 对象,用 于 存 储 从相 册 中 选 择 的 图 片。 然 后 构 建 出 一 个 Intent 对 象 , 并将 它 的 action 指 定 为 android.intent.action.GET_CONTENT。接着给这个 Intent 对象设置一些必要的参数,包括是 否允许缩放和裁剪、图片的输出位置等。最后调用 startActivityForResult()方法,就可以打开 相册程序选择照片了。
注意在调用 startActivityForResult() 方法的时候,我们给第二个参数传入的值仍然是CROP_PHOTO 常量,这样的好处就是从相册选择好照片之后,会直接进入到 CROP_PHOTO
的 case 下将图片显示出来,这样就可以复用之前写好的显示图片的逻辑,不用再编写一遍了。
现在将程序重新运行到手机上,然后点击一下 Choose From Album 按钮,就会打开相册
程序,如图 8.16
所示。

图 8.16
然后随意选择一张照片就可以对它进行裁剪,如图 8.17 所示。

图 8.17
最后点击完成,回到我们程序的界面,就会看到裁剪后的图片已经显示出来了,如图8.18
所示。

图 8.18
调用摄像头拍照以及从相册中选择照片是很多 Android 应用都会带有的功能,现在你已
经将这两种技术都学会了,将来在工作中如果需要开发类似的功能,相信你一定能轻松完成 吧。不过目前我们的实现还不算完美,因为某些照片即使经过裁剪后体积仍然很大,直接加 载到内存中有可能会导致程序崩溃。更好的做法是根据项目的需求先对照片进行适当的压缩,然后再加载到内存中。至于如何对照片进行压缩,就要考验你查阅资料的能力了,这里 就不再展开进行讲解。
android: 从相册中选择照片的更多相关文章
- swift -从相册中选择照片并上传
选择本地图片并上传是应用开发中一个比较常见的功能. 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/det ...
- Swift - 从相册中选择视频(过滤掉照片,使用UIImagePickerController)
(本文代码已升级至Swift4) 有时我们需要从系统相册中选择视频录像,来进行编辑或者上传操作,这时使用 UIImagePickerController 就可以实现. 默认情况下,UIImagePic ...
- jsp实现仿QQ空间新建多个相册名称,向相册中添加照片
工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删 ...
- Android--从相册中选取照片并返回结果
启动系统相册去选择图片 //从相册中选取的方法 private void selectPhoto(){ Intent intent = new Intent(Intent.ACTION_PICK); ...
- Android 打开相册拍照选择多张图片显示
添加依赖: compile 'me.iwf.photopicker:PhotoPicker:0.1.8' compile 'com.jaeger.ninegridimageview:library:1 ...
- Android从相册中获取图片以及路径
首先是相册图片的获取: private final String IMAGE_TYPE = "image/*"; private final int IMAGE_CODE = 0; ...
- android 相机拍照后选择照片编辑,相片编辑界面直线形状会显示锯齿状
因为 decode 出来的图片太小,小于屏幕.所以,显示的时候 会把图片略微放大,导致直线形状会显示锯齿状. 能够改动getScreenImageSize 方法中的size 的大小,比方能够把13 ...
- 从系统相册中选择GIF图片上传到服务器
-(void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)as ...
- HTML5 拖放:在相册中对照片进行排序
1. [代码]index.html <div class="albums"> <div class="album" id=&qu ...
随机推荐
- Unity3D手游开发日记(9) - 互动草的效果
所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...
- linux 常用目录
/bin 执行文件 ls, mv, rm, mkdir, rmdir, gzip, tar, telnet /boot linux核心文件内核 vmlinuz-xxx(Linux 的 Kernel ...
- net 连mysql奇怪问题
程序出现以上提示,采用6.3.5的connetor就好了.
- 【乔布斯05年斯坦福大学毕业典礼上的演讲】——Stay Hungry, Stay Foolish.(转)
Steve Jobs: Commencement Address at Stanford University "Stay Hungry, Stay Foolish." 求知若饥, ...
- React与ES6(三)ES6类和方法绑定
React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...
- Titanium系列--我常用的Titanium的快捷键(持续更新中。。)
Titanium快捷键: (注:Titanium属于eclipse系列的IDE) ctrl + shift + r 快速打开 ctrl + shift + e / ctrl + e 打开之前的文件 c ...
- angular-ui-bootstrap的进度条问题及解决
在测试angular-ui-bootstrap中的进度条的时候,用的是官方的示例代码,但是跑不起来. 经过代码比对之后,发现官方用的是0.14.3, 而我本地用的是0.13.3 (2015-08-09 ...
- JS编程常识
一.UI层的松耦合 松耦合就是要求各层遵循“最少知识原则”,或者说是各层各司其职,不要越权: HTML:结构层 CSS:表现层 JS:行为层 对于各层的职能,有一句比较贴切的解释:HTML是名词(n) ...
- CoreCLR on Mac:体验managed exception handling
C#测试代码: using System; class Program { static void A() { try { Console.WriteLine("Throwing an ex ...
- 作业七:团队项目——Alpha版本冲刺阶段-06
昨天进展:代码编写. 今天安排:代码编写.