編輯:關於Android編程
Android選擇圖片的兩種方式:
第一種:單張選取
通過隱式啟動activity,跳轉到相冊選擇一張返回結果
關鍵代碼如下:
發送請求:
private static final int PICTURE = 10086; //requestcode Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) {//因為Android SDK在4.4版本後圖片action變化了 所以在這裡先判斷一下 intent.setAction(Intent.ACTION_GET_CONTENT); } else { intent.setAction(Intent.ACTION_OPEN_DOCUMENT); } intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, PICTURE);
接收結果:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data == null) { this.finish(); return; } Uri uri = data.getData(); switch (requestCode) { case PICTURE: image = FileUtils.getUriPath(this, uri); //(因為4.4以後圖片uri發生了變化)通過文件工具類 對uri進行解析得到圖片路徑 break; default: break; } this.finish(); }
文件工具類:
public class FileUtils { private static final String TAG = "FileUtils"; private static final boolean DEBUG = false; /** * 獲取可讀的文件大小 */ public static String getReadableFileSize(int size) { final int BYTES_IN_KILOBYTES = 1024; final DecimalFormat dec = new DecimalFormat("###.#"); final String KILOBYTES = " KB"; final String MEGABYTES = " MB"; final String GIGABYTES = " GB"; float fileSize = 0; String suffix = KILOBYTES; if(size > BYTES_IN_KILOBYTES) { fileSize = size / BYTES_IN_KILOBYTES; if(fileSize > BYTES_IN_KILOBYTES) { fileSize = fileSize / BYTES_IN_KILOBYTES; if(fileSize > BYTES_IN_KILOBYTES) { fileSize = fileSize / BYTES_IN_KILOBYTES; suffix = GIGABYTES; } else { suffix = MEGABYTES; } } } return String.valueOf(dec.format(fileSize) + suffix); } /** * 獲取文件的文件名(不包括擴展名) */ public static String getFileNameWithoutExtension(String path) { if(path == null) { return null; } int separatorIndex = path.lastIndexOf(File.separator); if(separatorIndex < 0) { separatorIndex = 0; } int dotIndex = path.lastIndexOf("."); if(dotIndex < 0) { dotIndex = path.length(); } else if(dotIndex < separatorIndex) { dotIndex = path.length(); } return path.substring(separatorIndex + 1, dotIndex); } /** * 獲取文件名 */ public static String getFileName(String path) { if(path == null) { return null; } int separatorIndex = path.lastIndexOf(File.separator); return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length()); } /** * 獲取擴展名 */ public static String getExtension(String path) { if(path == null) { return null; } int dot = path.lastIndexOf("."); if(dot >= 0) { return path.substring(dot); } else { return ""; } } public static File getUriFile(Context context, Uri uri) { String path = getUriPath(context, uri); if(path == null) { return null; } return new File(path); } public static String getUriPath(Context context, Uri uri) { if(uri == null) { return null; } if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) { if("com.android.externalstorage.documents".equals(uri.getAuthority())) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if("com.android.providers.downloads.documents".equals(uri.getAuthority())) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } else if("com.android.providers.media.documents".equals(uri.getAuthority())) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] {split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } else if("content".equalsIgnoreCase(uri.getScheme())) { if("com.google.android.apps.photos.content".equals(uri.getAuthority())) { return uri.getLastPathSegment(); } return getDataColumn(context, uri, null, null); } else if("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if(cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if(cursor != null) cursor.close(); } return null; } }
第二種方式 批量選擇圖片
如果我們需要類似於微信那樣的一次選取多張圖片,很明顯第一種方式是不能滿足需求,那麼怎麼才能批量選取呢?andorid並提供像單張選取似的批量選取的直接方法,所以我們只能自己從數據庫中獲得。
首先我們要認識一個類mediastore android中所有的多媒體文件都存儲在這個數據庫中,例如圖片 視頻 音頻 等等,他通過contentprovider 向其他進程提供數據的接口
想要從mediastore中獲得數據,我們可以使用與ContentProvider 對應的ContentResolver
關鍵代碼:
final String[] projectionPhotos = { MediaStore.Images.Media._ID,//每一列的ID 圖片的ID MediaStore.Images.Media.BUCKET_ID,//圖片所在文件夾ID MediaStore.Images.Media.BUCKET_DISPLAY_NAME,//圖片所在文件夾名稱 MediaStore.Images.Media.DATA,//圖片路徑 MediaStore.Images.Media.DATE_TAKEN,//圖片創建時間 }; cursor = MediaStore.Images.Media.query(context.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI , projectionPhotos, "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");
所有圖片都在cursor裡了 再從cursor中取出即可
之前自己的編程完全是在PC上進行的,而且主要是在算法和數據結構上。由於某些需要加之認識到Android的重要性,且大學走到現在基本上沒什麼課了,空閒時間很多,於是就開始學
WeTest導讀本文通過對內存洩漏(what)及其危害性(why)的介紹,引出在Unity環境下定位和修復內存洩漏的方法和工具(how)。最後提出了一些避免洩漏的方法與建
小生做程序也有些許日子,從一個青澀的小白,慢慢的成長為了小有成就的程序猿,從不知名的碼農,到二三百人圈裡還有點小名氣的碼霸。 要說辛苦,可能每個程序心中都有各自的理解,大
下面這張圖片是在google官網上下載的關於android系統的體系結構圖: 組件所使用的C、C++庫的集合,一般說來,android應用開發者不能直接調