admin
2022-01-07 8dfe5354073b700af45d5cb472dd5f003e6f3f25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.ysvideo.zhibo.lib.common.util.ui;
 
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.FileUtils;
import android.provider.MediaStore;
import android.webkit.MimeTypeMap;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
 
import androidx.core.content.FileProvider;
 
/**
 * 系统裁剪图片工具类
 */
public class SystemClipImageUtil {
 
    /**
     * 剪切图片,兼容android10以上的版本,
     * 注意:需要AndroidManifest中需要配置FileProvider
     * @param context
     * @param uri 原图uri
     * @param name 图片名称
     * @param width 剪切后的宽
     * @param height 剪切后的高
     * @param requestCode 请求码
     * @return
     */
    public static Uri startPhotoZoom(Activity context, Uri uri, String name, int width, int height, int requestCode) {
        if (uri == null) {
            return null;
        }
        File cropPhoto = new File(context.getExternalCacheDir(), name);
        //m_ResultImagePath = CropPhoto.getPath();
        Uri mPhotoUri = Uri.fromFile(cropPhoto);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            cropPhoto = uriToFileApiQ(uri, context);
            mPhotoUri = FileProvider.getUriForFile(context,
                    context.getPackageName() + ".fileprovider", cropPhoto);
        }
        String headPath = cropPhoto.getPath();
 
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            intent.setDataAndType(mPhotoUri, "image/*");
        } else {
            intent.setDataAndType(uri, "image/*");
        }
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
        }
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);
        if (Build.MANUFACTURER.equals("HUAWEI")) {
            intent.putExtra("aspectX", 9998);
            intent.putExtra("aspectY", 9999);
        } else {
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
        }
 
        intent.putExtra("outputX", width);
        intent.putExtra("outputY", height);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        //intent.putExtra("noFaceDetection", true); // no face detection
 
        try {
            context.startActivityForResult(intent, requestCode);//这里的RESULT_REQUEST_CODE是在startActivityForResult里使用的返回值。
        } catch (Exception e) {
            // 解决截取后部分机型秒退
            e.printStackTrace();
        }
 
        return mPhotoUri;
    }
 
 
    @TargetApi(Build.VERSION_CODES.Q)
    private static File uriToFileApiQ(Uri uri, Context context) {
        File file = null;
        if (uri == null) return file;
        //android10以上转换
        if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
            file = new File(uri.getPath());
        } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //把文件复制到沙盒目录
            ContentResolver contentResolver = context.getContentResolver();
            String displayName = System.currentTimeMillis() + Math.round((Math.random() + 1) * 1000)
                    + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri));
 
//            注释掉的方法可以获取到原文件的文件名,但是比较耗时
//            Cursor cursor = contentResolver.query(uri, null, null, null, null);
//            if (cursor.moveToFirst()) {
//                String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));}
 
            try {
                InputStream is = contentResolver.openInputStream(uri);
                File cache = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath(), displayName);
                FileOutputStream fos = new FileOutputStream(cache);
                FileUtils.copy(is, fos);
                file = cache;
                fos.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }
 
 
}