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,如需转载请自行联系原作者
相关文章
|
12天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
13天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
1天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
2天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
2天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
8天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
8天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
3月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
132 1
|
3月前
|
SQL API Android开发
展望2022:Android 开发最新技术动向
展望2022:Android 开发最新技术动向
100 0
展望2022:Android 开发最新技术动向
|
SQL XML Java
展望2022:Android 开发最新技术动向
今年的 Android Dev Summit 在线上如期举行,在活动上 Google 的技术专家们会分享一些 Android 领域的技术动向以及开发心得。本文做一个全面盘点
2095 0