共享两种方式实现Android图像
来源:爱站网时间:2021-01-11编辑:网友分享
目前,大多数应用都有上传图片的功能,而我们自己开发的SDK也有类似的功能,那么接下来爱站技术频道小编就为大家讲解共享两种方式实现Android图像,有需要的小伙伴可以参考下文的介绍。
目前,大多数应用都有上传图片的功能,而我们自己开发的SDK也有类似的功能,那么接下来爱站技术频道小编就为大家讲解共享两种方式实现Android图像,有需要的小伙伴可以参考下文的介绍。
Android选择图片的两种方式:
第一种:单张选取
通过隐式启动activity,跳转到相册选择一张返回结果
关键代码如下:
发送请求:
private static final int PICTURE = 10086; //requestcode Intent intent = new Intent(); if (Build.VERSION.SDK_INT
接收结果:
@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) {
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");
共享两种方式实现Android图像,相信大家已经都了解了,希望这份解答能够对大家有所帮助,也希望大家能继续支持爱站技术频道。
