保存到媒体库

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("");
        }
        //   }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值