public class DownUtils {
static String APP_FOLDER_NAME = "壁纸";
public static final String TYPE_PNG = "image/png";
public static final String TYPE_MP3 = "audio/mpeg";
public static final String TYPE_MP4 = "video/mp4";
public static int TYPE_IMAGE = 1;
public static int TYPE_AUDIO = 2;//音频
public static int TYPE_VIDEO = 3;//视频
ReturnDownListen returnListen;
private String name;
public interface ReturnDownListen {
void successful(String path);
void fail(String error);
}
/**
* @param name 保存之后的文件名称 带后缀
* @param returnListen 返回监听
*/
public DownUtils(String name, ReturnDownListen returnListen) {
this.returnListen = returnListen;
this.name = name;
}
/**
* @param path 源路径
* @param type 文件类型 图片/视频
* @param mimeType 精确的 MIME 类型 "image/jpeg"、"image/png" "video/mp4"、"video/3gpp" "audio/mp3";
*/
public void save(Context context, String path, int type, String mimeType) {
Uri uri = getSaveUri(context, type, mimeType);
if (uri != null) {
try {
fileWriteIn(context.getContentResolver().openOutputStream(uri), new FileInputStream(path), returnListen);
} catch (FileNotFoundException e) {
returnListen.fail(e.getMessage());
throw new RuntimeException(e);
}
} else {
returnListen.fail("出错了");
}
}
private Uri getSaveUri(Context context, int type, String mimeType) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
String folderPath = getFolder(type);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.MediaColumns.RELATIVE_PATH, folderPath + "/" + DownUtils.APP_FOLDER_NAME);
} else {
//这里也可以修改
String endPath = Environment.getExternalStorageDirectory().getPath() + "/" + folderPath + "/" + DownUtils.APP_FOLDER_NAME + "/";
File fileDir = new File(endPath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
values.put(MediaStore.MediaColumns.DATA, endPath + name);
}
ContentResolver contentResolver = context.getContentResolver();
return contentResolver.insert(getFolderUri(type), values);
}
private String getFolder(int type){
String folderPath = "";
if (TYPE_AUDIO == (type)) {
folderPath = Environment.DIRECTORY_MUSIC;
} else if (TYPE_VIDEO == (type)) {
folderPath = Environment.DIRECTORY_MOVIES;
} else if (TYPE_IMAGE == (type)) {
folderPath = Environment.DIRECTORY_PICTURES;
}
return folderPath;
}
private Uri getFolderUri(int type){
Uri saveUri;
if (TYPE_AUDIO == (type)) {
saveUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
} else if (TYPE_VIDEO == (type)) {
saveUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if (TYPE_IMAGE == (type)) {
saveUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else {
saveUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
return saveUri;
}
private Uri getDownUri(Context context) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
ContentResolver contentResolver = context.getContentResolver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_DOWNLOADS}/$APP_FOLDER_NAME");
return contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
}
/*else {
//这里也可以修改
String endPath = Environment.getExternalStorageDirectory().getPath() + "/" + Environment.DIRECTORY_DOWNLOADS + "/" + DownUtils.APP_FOLDER_NAME + "/";
File fileDir = new File(endPath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
}*/
return null;
}
/**
* 写入文件
*/
private static void fileWriteIn(OutputStream out, InputStream input, ReturnDownListen returnListen) {
try {
byte[] data = new byte[4096];
int len;
while ((len = input.read(data)) != -1) {
out.write(data, 0, len);
}
returnListen.successful("");
} catch (IOException e) {
e.printStackTrace();
returnListen.fail(e.getMessage());
} finally {
try {
out.close();
input.close();
} catch (IOException e) {
returnListen.fail(e.getMessage());
e.printStackTrace();
}
}
}
/**
* @param context 上下文
* @param netUrl 网络链接
* 从网络下载到本地
*/
public void downloadUrl(Context context, String netUrl) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL urlObj = new URL(netUrl);
HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
Uri uri = getDownUri(context);
if (uri == null) {
returnListen.fail("出错了");
}
fileWriteIn(context.getContentResolver().openOutputStream(uri), conn.getInputStream(), returnListen);
} else {
String endPath = Environment.getExternalStorageDirectory().getPath() + "/" + Environment.DIRECTORY_DOWNLOADS + "/" + DownUtils.APP_FOLDER_NAME + "/";
// Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File file = new File(endPath, "my_file_name");
File fileDir = new File(endPath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
fileWriteIn(new FileOutputStream(file), conn.getInputStream(), returnListen);
}
/*OutputStream outputStream = context.getContentResolver().openOutputStream(uri);
FileOutputStream fileOutput = new FileOutputStream(file);
if (conn.getResponseCode() == 200) {
byte[] buffer = new byte[2048];
int len;
while ((len = conn.getInputStream().read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
returnListen.successful(uri + "");
} else {
returnListen.fail(context.getString(R.string.file_down_fail));
}*/
} catch (IOException e) {
e.printStackTrace();
returnListen.fail("出错了");
}
}
});
thread.start();
}
/**
* Uri 转 绝对路径
*
* @param uri
* @return
*/
public String getUriToPath(Context context, Uri uri) {
// 以 content:// 开头的,比如 content://media/external/file/960
String path = "";
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, projection, null,
null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (columnIndex > -1) {
path = cursor.getString(columnIndex);
}
}
cursor.close();
}
}
return path;
}
/*val cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "${MediaStore.MediaColumns.DATE_ADDED} desc")
if (cursor != null) {
while (cursor.moveToNext()) {
val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID))
val uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)
println("image uri is $uri")
}
cursor.close()
}*/
/**
* 根据 uri 删除旧的文件
*/
private void deleteFileByMiniType(Context context, String miniType, String fileName) {
if (miniType.equals(TYPE_IMAGE)) {
//图片
context.getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DISPLAY_NAME + "=?", new String[]{fileName});
} else if (miniType.equals(TYPE_AUDIO)) {
//音频
context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.Audio.Media.DISPLAY_NAME + "=?", new String[]{fileName});
} else if (miniType.equals(TYPE_VIDEO)) {
//视频
context.getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, MediaStore.Video.Media.DISPLAY_NAME + "=?", new String[]{fileName});
}
}
//删除
public void delFile(Context context, Uri fileUrl, String name, ReturnDownListen returnListen) {
String path = getUriToPath(context, fileUrl);
int row = context.getContentResolver().delete(fileUrl, null, null);
// if (row == 0) {
try {
File f = new File(path);
// Log.d("TAG", "delFile: " + f + "//" + f.exists())
if (f.exists()) {
f.delete();
returnListen.successful("");
}
} catch (Exception e) {
returnListen.fail("");
}
// }
}
}
保存到媒体库
最新推荐文章于 2024-10-06 20:16:20 发布