mirror of
https://github.com/apache/cordova-plugin-camera.git
synced 2025-01-18 19:22:51 +08:00
feat(android)!: Android 13 support (#844)
* feat(android)!: Android 13 support * refactor(android): simplify getPermissions logic * feat(android)!: bump cordova-android requirement to >=12.0.0 * feat(android): update saveAlbumPermission to include Android 9 and below use case --------- Co-authored-by: ochakov <evgeny@ochakov.com>
This commit is contained in:
parent
61a6e9bb44
commit
505ccefb4c
2
package-lock.json
generated
2
package-lock.json
generated
@ -37,7 +37,7 @@
|
|||||||
},
|
},
|
||||||
"7.0.0": {
|
"7.0.0": {
|
||||||
"cordova": ">=9.0.0",
|
"cordova": ">=9.0.0",
|
||||||
"cordova-android": ">=10.0.0",
|
"cordova-android": ">=12.0.0",
|
||||||
"cordova-ios": ">=5.1.0"
|
"cordova-ios": ">=5.1.0"
|
||||||
},
|
},
|
||||||
"8.0.0": {
|
"8.0.0": {
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
"cordova": ">=9.0.0"
|
"cordova": ">=9.0.0"
|
||||||
},
|
},
|
||||||
"7.0.0": {
|
"7.0.0": {
|
||||||
"cordova-android": ">=10.0.0",
|
"cordova-android": ">=12.0.0",
|
||||||
"cordova-ios": ">=5.1.0",
|
"cordova-ios": ">=5.1.0",
|
||||||
"cordova": ">=9.0.0"
|
"cordova": ">=9.0.0"
|
||||||
},
|
},
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
<engines>
|
<engines>
|
||||||
<engine name="cordova" version=">=9.0.0"/>
|
<engine name="cordova" version=">=9.0.0"/>
|
||||||
<engine name="cordova-android" version=">=10.0.0" />
|
<engine name="cordova-android" version=">=12.0.0" />
|
||||||
<engine name="cordova-ios" version=">=5.1.0" />
|
<engine name="cordova-ios" version=">=5.1.0" />
|
||||||
</engines>
|
</engines>
|
||||||
|
|
||||||
@ -55,7 +55,9 @@
|
|||||||
</feature>
|
</feature>
|
||||||
</config-file>
|
</config-file>
|
||||||
<config-file target="AndroidManifest.xml" parent="/*">
|
<config-file target="AndroidManifest.xml" parent="/*">
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||||
</config-file>
|
</config-file>
|
||||||
<config-file target="AndroidManifest.xml" parent="application">
|
<config-file target="AndroidManifest.xml" parent="application">
|
||||||
<provider
|
<provider
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.apache.cordova.camera;
|
package org.apache.cordova.camera;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
@ -59,6 +60,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,8 +124,6 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
private boolean orientationCorrected; // Has the picture's orientation been corrected
|
private boolean orientationCorrected; // Has the picture's orientation been corrected
|
||||||
private boolean allowEdit; // Should we allow the user to crop the image.
|
private boolean allowEdit; // Should we allow the user to crop the image.
|
||||||
|
|
||||||
protected final static String[] permissions = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
|
|
||||||
|
|
||||||
public CallbackContext callbackContext;
|
public CallbackContext callbackContext;
|
||||||
private int numPics;
|
private int numPics;
|
||||||
|
|
||||||
@ -193,8 +193,9 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
}
|
}
|
||||||
else if ((this.srcType == PHOTOLIBRARY) || (this.srcType == SAVEDPHOTOALBUM)) {
|
else if ((this.srcType == PHOTOLIBRARY) || (this.srcType == SAVEDPHOTOALBUM)) {
|
||||||
// FIXME: Stop always requesting the permission
|
// FIXME: Stop always requesting the permission
|
||||||
if(!PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
|
String[] permissions = getPermissions(true, mediaType);
|
||||||
PermissionHelper.requestPermission(this, SAVE_TO_ALBUM_SEC, Manifest.permission.READ_EXTERNAL_STORAGE);
|
if(!hasPermissions(permissions)) {
|
||||||
|
PermissionHelper.requestPermissions(this, SAVE_TO_ALBUM_SEC, permissions);
|
||||||
} else {
|
} else {
|
||||||
this.getImage(this.srcType, destType);
|
this.getImage(this.srcType, destType);
|
||||||
}
|
}
|
||||||
@ -221,6 +222,37 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// LOCAL METHODS
|
// LOCAL METHODS
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
private String[] getPermissions(boolean storageOnly, int mediaType) {
|
||||||
|
ArrayList<String> permissions = new ArrayList<>();
|
||||||
|
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
// Android API 33 and higher
|
||||||
|
switch (mediaType) {
|
||||||
|
case PICTURE:
|
||||||
|
permissions.add(Manifest.permission.READ_MEDIA_IMAGES);
|
||||||
|
break;
|
||||||
|
case VIDEO:
|
||||||
|
permissions.add(Manifest.permission.READ_MEDIA_VIDEO);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
permissions.add(Manifest.permission.READ_MEDIA_IMAGES);
|
||||||
|
permissions.add(Manifest.permission.READ_MEDIA_VIDEO);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Android API 32 or lower
|
||||||
|
permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
|
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!storageOnly) {
|
||||||
|
// Add camera permission when not storage.
|
||||||
|
permissions.add(Manifest.permission.CAMERA);
|
||||||
|
}
|
||||||
|
|
||||||
|
return permissions.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
private String getTempDirectoryPath() {
|
private String getTempDirectoryPath() {
|
||||||
File cache = cordova.getActivity().getCacheDir();
|
File cache = cordova.getActivity().getCacheDir();
|
||||||
// Create the cache directory if it doesn't exist
|
// Create the cache directory if it doesn't exist
|
||||||
@ -243,8 +275,13 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
* @param encodingType Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
|
* @param encodingType Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
|
||||||
*/
|
*/
|
||||||
public void callTakePicture(int returnType, int encodingType) {
|
public void callTakePicture(int returnType, int encodingType) {
|
||||||
boolean saveAlbumPermission = PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
String[] storagePermissions = getPermissions(true, mediaType);
|
||||||
&& PermissionHelper.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
boolean saveAlbumPermission;
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
saveAlbumPermission = this.saveToPhotoAlbum ? hasPermissions(storagePermissions) : true;
|
||||||
|
} else {
|
||||||
|
saveAlbumPermission = hasPermissions(storagePermissions);
|
||||||
|
}
|
||||||
boolean takePicturePermission = PermissionHelper.hasPermission(this, Manifest.permission.CAMERA);
|
boolean takePicturePermission = PermissionHelper.hasPermission(this, Manifest.permission.CAMERA);
|
||||||
|
|
||||||
// CB-10120: The CAMERA permission does not need to be requested unless it is declared
|
// CB-10120: The CAMERA permission does not need to be requested unless it is declared
|
||||||
@ -275,10 +312,9 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
} else if (saveAlbumPermission) {
|
} else if (saveAlbumPermission) {
|
||||||
PermissionHelper.requestPermission(this, TAKE_PIC_SEC, Manifest.permission.CAMERA);
|
PermissionHelper.requestPermission(this, TAKE_PIC_SEC, Manifest.permission.CAMERA);
|
||||||
} else if (takePicturePermission) {
|
} else if (takePicturePermission) {
|
||||||
PermissionHelper.requestPermissions(this, TAKE_PIC_SEC,
|
PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, storagePermissions);
|
||||||
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE});
|
|
||||||
} else {
|
} else {
|
||||||
PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, permissions);
|
PermissionHelper.requestPermissions(this, TAKE_PIC_SEC, getPermissions(false, mediaType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1232,6 +1268,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
// delete the duplicate file if the difference is 2 for file URI or 1 for Data URL
|
// delete the duplicate file if the difference is 2 for file URI or 1 for Data URL
|
||||||
if ((currentNumOfImages - numPics) == diff) {
|
if ((currentNumOfImages - numPics) == diff) {
|
||||||
cursor.moveToLast();
|
cursor.moveToLast();
|
||||||
|
@SuppressLint("Range")
|
||||||
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
|
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
|
||||||
if (diff == 2) {
|
if (diff == 2) {
|
||||||
id--;
|
id--;
|
||||||
@ -1391,4 +1428,13 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
|
|||||||
|
|
||||||
this.callbackContext = callbackContext;
|
this.callbackContext = callbackContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasPermissions(String[] permissions) {
|
||||||
|
for (String permission: permissions) {
|
||||||
|
if (!PermissionHelper.hasPermission(this, permission)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user