time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android应用开发入门(六十八)通过系统Gallery获取图片

Android应用开发入门(六十八)通过系统Gallery获取图片

时间:2013-12-09 15:57 点击:3049次 字体:[ ]




前言

  在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"的图片缩略图。



本文地址 : http://www.fengfly.com/plus/view-214216-1.html
标签: Android Gallery 系统
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: