分享實(shí)現(xiàn)Android圖片選擇的兩種方式
Android選擇圖片的兩種方式:
第一種:單張選取
通過隱式啟動(dòng)activity,跳轉(zhuǎn)到相冊選擇一張返回結(jié)果
關(guān)鍵代碼如下:
發(fā)送請求:
private static final int PICTURE = 10086; //requestcode
Intent intent = new Intent();
if (Build.VERSION.SDK_INT < 19) {//因?yàn)锳ndroid 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);
接收結(jié)果:
@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); //(因?yàn)?.4以后圖片uri發(fā)生了變化)通過文件工具類 對uri進(jìn)行解析得到圖片路徑
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);
}
/**
* 獲取文件的文件名(不包括擴(kuò)展名)
*/
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());
}
/**
* 獲取擴(kuò)展名
*/
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并提供像單張選取似的批量選取的直接方法,所以我們只能自己從數(shù)據(jù)庫中獲得。
首先我們要認(rèn)識一個(gè)類mediastore android中所有的多媒體文件都存儲在這個(gè)數(shù)據(jù)庫中,例如圖片 視頻 音頻 等等,他通過contentprovider 向其他進(jìn)程提供數(shù)據(jù)的接口
想要從mediastore中獲得數(shù)據(jù),我們可以使用與ContentProvider 對應(yīng)的ContentResolver
關(guān)鍵代碼:
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,//圖片創(chuàng)建時(shí)間
};
cursor = MediaStore.Images.Media.query(context.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI
, projectionPhotos, "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");
所有圖片都在cursor里了 再從cursor中取出即可
相關(guān)文章
Android 中SP與DP的區(qū)別實(shí)例詳解
這篇文章主要介紹了Android 中SP與DP的區(qū)別實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10
Android上傳文件到Web服務(wù)器 PHP接收文件
這篇文章主要為大家詳細(xì)介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android自定義View實(shí)現(xiàn)QQ消息氣泡
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)QQ消息氣泡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Android NDK開發(fā)之:配置環(huán)境的詳解
本篇文章是對Android中的配置環(huán)境進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

