增加上传图片,从相册选取照片显示还有点问题
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
package com.ttstd.elderlyassistant.utils;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.provider.MediaStore;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class FileUtils {
|
||||
|
||||
public static File uriToFile(Context context, Uri uri) throws IOException {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||
// Android 10 以下用 MediaStore 查询
|
||||
File file = uriToFileLegacy(context, uri);
|
||||
if (file != null) return file;
|
||||
}
|
||||
// Android 10+ 或查询失败时使用沙盒复制
|
||||
return uriToFileModern(context, uri);
|
||||
}
|
||||
|
||||
public static File uriToFileLegacy(Context context, Uri uri) {
|
||||
String[] projection = {MediaStore.Images.Media.DATA};
|
||||
try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
|
||||
String filePath = cursor.getString(columnIndex);
|
||||
return new File(filePath);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e("URI_TO_FILE", "Query failed: " + e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static File uriToFileModern(Context context, Uri uri) throws IOException {
|
||||
ContentResolver resolver = context.getContentResolver();
|
||||
String fileName = getFileName(resolver, uri); // 获取文件名(见下文辅助方法)
|
||||
File cacheDir = context.getExternalCacheDir(); // 建议使用缓存目录
|
||||
File outputFile = new File(cacheDir, fileName);
|
||||
|
||||
try (InputStream is = resolver.openInputStream(uri);
|
||||
OutputStream os = new FileOutputStream(outputFile)) {
|
||||
byte[] buffer = new byte[1024];
|
||||
int len;
|
||||
while ((len = is.read(buffer)) != -1) {
|
||||
os.write(buffer, 0, len);
|
||||
}
|
||||
}
|
||||
return outputFile;
|
||||
}
|
||||
|
||||
// 获取文件名辅助方法
|
||||
private static String getFileName(ContentResolver resolver, Uri uri) {
|
||||
String name = null;
|
||||
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
|
||||
try (Cursor cursor = resolver.query(uri, null, null, null, null)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
name = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name == null) {
|
||||
name = uri.getLastPathSegment(); // 备用方案
|
||||
}
|
||||
return name;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user