您的位置:首页 > 移动开发 > Android开发

Android -- 超全的 File,Bitmap,Uri, FilePath 之间的转换方法

2018-01-24 17:42 567 查看
1.文件(path)转Bitmap

File file = new File(filePath);
Uri uri = Uri.fromFile(file);
Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);




Bitmap loadbitmap = BitmapFactory.decodeFile(file);
/*同类型的还有
BitmapFactory.decodeStream(InputStream inputStream);
BitmapFactory.decodeResource();
BitmapFactory.decodeByteArray();
BitmapFactory.decodeFileDescriptor();...
*/


或 先压缩,再转

Bitmap loadbitmap = BitmapFactory.decodeFile(imagePath, getBitmapOption(2));
private BitmapFactory.Options getBitmapOption(int inSampleSize)
{
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
options.inSampleSize = inSampleSize;
return options;
}


2.Bitmap 转 文件

public void saveBitmapFile(Bitmap bitmap) {
File file = new File(filePath);//将要保存图片的路径
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}


3.Uri 转 File

/**
* uri 转 File
*/
public File uriTurnFile(Uri uri) {

return new File(uri.getPath());

}


4.File 转 Uri

/**
* File 转 Uri
*/
public Uri fileTurnUri(File file) {
return  Uri.fromFile(file);
}


5.url路径 转 Bitmap(加载网络图片)

/**
* 根据url路径 转bitmap
*
* @param urlpath
* @return
*/
public Bitmap getBitmap(String urlpath) {

Bitmap map = null;
try {
URL url = new URL(urlpath);
URLConnection conn = url.openConnection();
conn.connect();
InputStream in;
in = conn.getInputStream();
map = BitmapFactory.decodeStream(in);
} catch (IOException e) {
e.printStackTrace();
}
return map;
}


6.Uri 转 Bitmap

//读取图片,并将图片缩放到指定的目标大小
InputStream stream = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
stream.close();




Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);


7.Path 转 Uri

FilePath 转 FileUri

File f = new File(filePath);
Uri uri = Uri.fromFile(f);


FilePath 转 MediaUri

public static Uri getMediaUriFromPath(Context context, String path) {
Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = context.getContentResolver().query(mediaUri, null,
MediaStore.Images.Media.DISPLAY_NAME + "= ?",
new String[] {path.substring(path.lastIndexOf("/") + 1)},
null);

Uri uri = null;
if(cursor.moveToFirst()) {
uri = ContentUris.withAppendedId(mediaUri,
cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
}
cursor.close();
return uri;
}


8.Uri 转 Path

/**
* 4.4之前
* uri 转 path
*/
public String getRealPathFromUri(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}


/**
* android 4.4 及以后获取 uri 真实路径
*/
public String getRealFilePath(Uri uri) {
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = mContext.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}


或(这个覆盖面更广,前面的可能有些情况不行)

private void handleImageBeforeKitKat(Uri uri) {
String imagePath = getImagePath(uri, null);
}

@TargetApi(Build.VERSION_CODES.KITKAT)
private void handleImageOnKitKat(Uri uri) {
String imagePath = null;
if (DocumentsContract.isDocumentUri(this, uri)) {
//如果是Document类型的Uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];//解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);

} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
//如果是content类型的uri,使用普通方式处理
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
//如果是file类型的Uri,直接获取图片路径
imagePath = uri.getPath();
}

}

private String getImagePath(Uri uri, String selection) {
String path = null;
//通过Uri和selection来获取真实的图片路径
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
(摘自第一行代码)


大部分来源于写过的代码,第八点部分来源于网络及书本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: