Android开发实践:自己动手编写图片剪裁应用(2)

简介:

其实Android系统本身也提供了图片剪裁的模块,我们可以直接通过Intent来调用系统的图片剪裁功能,本文我们就先了解一下系统自带的图片剪裁功能是如何调用的吧。


  1. 得到被剪裁图片的URL地址


既然是图片剪裁,就一定要有被剪裁的图片,由于图片数据一般很大,为了防止内存溢出,普通APP与Android系统图片剪裁应用之间是通过URL来传递图片地址的。这个URL与我们常说见的网络URL不一样,它并不是HTTP开头,而是以file或者content开头的字符串,例如:


1
2
3
“file: ///sdcard/test.jpg”
 
“content: //media/external/images/media/21936”

这里,我们首先介绍获取图片URL的方法:


(1) 从SDCard中得到图片的URL


假设知道图片存放的路径位于“/sdcard/test.jpg”,那么,可以通过下面这种方式来得到URL:


1
Uri imageUri = Uri.fromFile( new  File( "/sdcard/test.jpg" ));

当然,如果图片是从网络获取的,并不存在于sdcard中,则可以先保存一份临时文件到sdcard中,再通过上述方法得到URL。


注:通过这种方式得到的URL,一般以“file://”开头。


(2) 从多媒体数据库中得到图片的URL


Android系统会在后台定期扫描存储在系统中的多媒体文件,如:音乐、图片和视频等,相关的信息会存放在系统的多媒体数据库中,位于/data/data/com.android.providers.media/databases中,我们可以通过检索该数据库得到图片的URL(例如:通过检索数据库得到系统最后一次添加/修改的照片URL),也可以通过Intent.ACTION_PICK来调用系统的图片选择器来选择一张图片,图片选择器会将图片的URL地址放入Intent的data中返回。


后者的应用更多一些,我们主要介绍一下后者,即通过Intent.ACTION_PICK来得到图片URL地址,方法如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  void  pickImage() {
     Intent intent =  new  Intent(Intent.ACTION_PICK);
     intent.setType( "image/*" );
     startActivityForResult(intent,REQUEST_CODE_PICK_IMAGE);
}
 
@Override
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
     if  (resultCode != RESULT_OK) {
         return ;
     }
     if ( requestCode == REQUEST_CODE_PICK_IMAGE ) {
         Uri imageUri = data.getData();
         //......
     }
}


注:通过这种方式得到的URL,一般以“content://media”开头。


(3) 调用系统的相机拍一张照片


当然,被剪裁的图片也可以是通过Camera拍摄的一张照片,方法如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Uri pictureURL = Uri.fromFile( new  File( "/sdcard/temp.jpg" ));
 
public  void  takenPicture() {
     Intent intent =  new  Intent(MediaStore.ACTION_IMAGE_CAPTURE);
     intent.putExtra(MediaStore.EXTRA_OUTPUT,pictureURL );
     startActivityForResult(intent,REQUEST_CODE_TAKEN_PICTURE);
}
 
@Override
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
     if  (resultCode != RESULT_OK) {
         return ;
     }
     if ( requestCode == REQUEST_CODE_TAKEN_PICTURE ) {
         Uri imageUri = pictureURL;
         //......
     }
}


通过代码你可能已经注意到了,其实这种方式得到的图片URL,与第一种方式是一样的,通过图片的存储路径转化过来的,只不过传递给了系统Camera应用中。


2. 通过Intent调用系统的图片剪裁功能


有了图片的URL,调用系统的图片剪裁就很简单了,只需要构建一个Intent对象,并设置相关参数即可,用法示例如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public  void  test( Uri imageUri ) {
     Uri croppedUri = Uri.fromFile( new  File( "/sdcard/cropped.jpg" ));
     startSystemCropImage(imageUri,croppedUri);
}
 
public  void  startSystemCropImage( Uri src, Uri dst ) {
 
     Intent intent =  new  Intent( "com.android.camera.action.CROP" );      
     intent.putExtra( "crop" "true" );    
 
     // 设置剪裁图片的源/目的地址URL
     intent.setDataAndType(src, "image/*" );
     intent.putExtra(MediaStore.EXTRA_OUTPUT,dst);
 
     // 设置剪裁图片的宽高比
     //intent.putExtra("aspectX", 2);   
     //intent.putExtra("aspectY", 1);
     
     // 固定剪裁图片的宽高值
     //intent.putExtra("outputX", 680); 
     //intent.putExtra("outputY", 480);    
     
     // 为了防止内存限制以及各个厂商返回的数据不统一,建议不要直接使用这个返回的数据,而是数据返回的URL
     intent.putExtra( "return-data" false );
     
     startActivityForResult(intent, REQUEST_CODE_SYSTEM_CROPPER);
}
 
@Override
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
 
     if  (resultCode != RESULT_OK) {
         return ;
     }
 
     if ( requestCode == REQUEST_CODE_IMAGE_CROPPER ) {
             
         Uri croppedUri = data.getExtras().getParcelable(MediaStore.EXTRA_OUTPUT);
     
         InputStream in =  null ;
         try  {
             in = getContentResolver().openInputStream(croppedUri);
             Bitmap b = BitmapFactory.decodeStream(in);
             mImageView.setImageBitmap(b);            
        
         catch  (FileNotFoundException e) {
             e.printStackTrace();
         }          
     }
     super .onActivityResult(requestCode, resultCode, data);
}


3. 小结


注意添加读写SDCard的权限:


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



本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1602611,如需转载请自行联系原作者
相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
1天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
1天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第24天】随着移动开发技术的不断演进,提升应用性能和用户体验已成为开发者的核心任务。在Android平台上,Kotlin语言凭借其简洁性和功能性成为主流选择之一。特别是Kotlin的协程功能,它为异步编程提供了一种轻量级的解决方案,使得处理并发任务更加高效和简洁。本文将深入探讨Kotlin协程在Android开发中的应用,通过实际案例分析协程如何优化应用性能,以及如何在项目中实现协程。
|
2天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
6 0
Android系统 应用存储路径与权限
|
2天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
16 0
|
7天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
5 0
|
7天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
11 0
|
Java 测试技术 开发工具
《Android应用开发攻略》——导读
对于蜂窝技术和移动计算来说,Android是“开放源码的革命”,至少是革命的一部分。从已经不存在的Openmoko FreeRunner到QT Embedded、Moblin、 LiMo、 Debian Mobile,以及Maemo和最近刚刚开放源码的Symbian OS、刚刚消失的HP WebOS,人们对于提供开放源码的蜂窝技术已经做出了许多的尝试。
1166 0
|
测试技术 Android开发
《Android应用开发攻略》——3.13 发送文本消息以及AVD之间的通话
本节书摘来自华章计算机《Android应用开发攻略》一书中的第3章,第3.13节,作者:(美)达尔文(Darwin, I. F.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1266 0