lmw
2024-09-25 92778728b83ce1a34ba21bcdb061afdeca16cce5
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package com.ypx.imagepicker.helper;
 
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import com.ypx.imagepicker.bean.ImageItem;
import com.ypx.imagepicker.bean.MimeType;
import com.ypx.imagepicker.bean.PickerError;
import com.ypx.imagepicker.bean.UriPathInfo;
import com.ypx.imagepicker.data.OnImagePickCompleteListener;
import com.ypx.imagepicker.helper.launcher.PLauncher;
import com.ypx.imagepicker.utils.PBitmapUtils;
import com.ypx.imagepicker.utils.PDateUtil;
import com.ypx.imagepicker.utils.PPermissionUtils;
import com.ypx.imagepicker.utils.PSingleMediaScanner;
import com.ypx.imagepicker.utils.PickerFileProvider;
 
import java.io.File;
import java.util.ArrayList;
import java.util.List;
 
public class CameraCompat {
 
 
    /**
     * 兼容安卓10拍照.因为安卓Q禁止直接写入文件到系统DCIM文件下,所以拍照入参必须是私有目录路径
     * 如果想让拍摄的照片写入外部存储中,则需要copy一份文件到DCIM目录中并刷新媒体库
     *
     * @param activity     调用拍照的页面
     * @param imageName    图片名称
     * @param isCopyInDCIM 是否copy到DCIM中
     * @param listener     拍照回调
     */
    public static void takePhoto(final Activity activity,
                                 final String imageName,
                                 final boolean isCopyInDCIM,
                                 final OnImagePickCompleteListener listener) {
        final String path = PBitmapUtils.getPickerFileDirectory(activity).getAbsolutePath() +
                File.separator + imageName + ".jpg";
        if (!PPermissionUtils.hasCameraPermissions(activity) || listener == null) {
            return;
        }
        final Uri imageUri = PickerFileProvider.getUriForFile(activity, new File(path));
        PLauncher.init(activity).startActivityForResult(getTakePhotoIntent(activity, imageUri), new PLauncher.Callback() {
            @Override
            public void onActivityResult(int resultCode, Intent data) {
                if (resultCode != Activity.RESULT_OK || path == null || path.trim().length() == 0) {
                    PickerErrorExecutor.executeError(listener, PickerError.TAKE_PHOTO_FAILED.getCode());
                    return;
                }
                UriPathInfo uriPathInfo;
                if (isCopyInDCIM) {
                    uriPathInfo = PBitmapUtils.copyFileToDCIM(activity, path, imageName, MimeType.JPEG);
                    PSingleMediaScanner.refresh(activity, uriPathInfo.absolutePath, null);
                } else {
                    uriPathInfo = new UriPathInfo(imageUri, path);
                }
 
                ImageItem item = new ImageItem();
                item.path = uriPathInfo.absolutePath;
                item.mimeType = MimeType.JPEG.toString();
                item.setUriPath(uriPathInfo.uri.toString());
                item.time = System.currentTimeMillis();
                int[] size = PBitmapUtils.getImageWidthHeight(path);
                item.width = size[0];
                item.height = size[1];
                item.mimeType = MimeType.JPEG.toString();
                ArrayList<ImageItem> list = new ArrayList<>();
                list.add(item);
                listener.onImagePickComplete(list);
            }
        });
    }
 
    /**
     * 兼容安卓10拍摄视频.因为安卓Q禁止直接写入文件到系统DCIM文件下,所以拍照入参必须是私有目录路径
     * 如果想让拍摄的照片写入外部存储中,则需要copy一份文件到DCIM目录中并刷新媒体库
     *
     * @param activity     activity
     * @param videoName    视频保存路径
     * @param maxDuration  视频最大时长
     * @param isCopyInDCIM 是否copy到DCIM中
     * @param listener     视频回调
     */
    public static void takeVideo(final Activity activity,
                                 final String videoName,
                                 long maxDuration,
                                 final boolean isCopyInDCIM,
                                 final OnImagePickCompleteListener listener) {
        if (!PPermissionUtils.hasCameraPermissions(activity) || listener == null) {
            return;
        }
        final String path = PBitmapUtils.getPickerFileDirectory(activity).getAbsolutePath() +
                File.separator + videoName + ".mp4";
        final Uri videoUri = PickerFileProvider.getUriForFile(activity, new File(path));
        PLauncher.init(activity).startActivityForResult(getTakeVideoIntent(activity, videoUri, maxDuration), new PLauncher.Callback() {
            @Override
            public void onActivityResult(int resultCode, Intent data) {
                if (resultCode != Activity.RESULT_OK || path == null || path.trim().length() == 0) {
                    PickerErrorExecutor.executeError(listener, PickerError.TAKE_PHOTO_FAILED.getCode());
                    return;
                }
                UriPathInfo uriPathInfo;
                if (isCopyInDCIM) {
                    uriPathInfo = PBitmapUtils.copyFileToDCIM(activity, path, videoName, MimeType.MP4);
                    PSingleMediaScanner.refresh(activity, uriPathInfo.absolutePath, null);
                } else {
                    uriPathInfo = new UriPathInfo(videoUri, path);
                }
 
                ImageItem item = new ImageItem();
                item.path = uriPathInfo.absolutePath;
                item.setUriPath(uriPathInfo.uri.toString());
                item.time = System.currentTimeMillis();
                item.mimeType = MimeType.MP4.toString();
                item.setVideo(true);
                item.duration = PBitmapUtils.getLocalVideoDuration(path);
                item.setDurationFormat(PDateUtil.getVideoDuration(item.duration));
                ArrayList<ImageItem> list = new ArrayList<>();
                list.add(item);
                listener.onImagePickComplete(list);
            }
        });
    }
 
    private static Intent getTakePhotoIntent(Activity activity, Uri imageUri) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
 
            if (Build.VERSION.SDK_INT < 21) {
                List<ResolveInfo> resInfoList = activity.getPackageManager()
                        .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
                for (ResolveInfo resolveInfo : resInfoList) {
                    String packageName = resolveInfo.activityInfo.packageName;
                    activity.grantUriPermission(packageName, imageUri,
                            Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                }
            }
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
        return intent;
    }
 
    private static Intent getTakeVideoIntent(Activity activity, Uri imageUri, long maxDuration) {
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (Build.VERSION.SDK_INT < 21) {
                List<ResolveInfo> resInfoList = activity.getPackageManager()
                        .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
                for (ResolveInfo resolveInfo : resInfoList) {
                    String packageName = resolveInfo.activityInfo.packageName;
                    activity.grantUriPermission(packageName, imageUri,
                            Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                }
            }
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            if (maxDuration > 1) {
                intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, maxDuration / 1000L);
            }
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
        return intent;
    }
 
}