diff --git a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java index b4311eb..9d3f3d2 100644 --- a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java +++ b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java @@ -47,6 +47,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.List; +import java.util.ArrayList; import com.facebook.react.modules.core.PermissionListener; import com.facebook.react.modules.core.PermissionAwareActivity; @@ -542,14 +543,23 @@ public class ImagePickerModule extends ReactContextBaseJavaModule @NonNull final Callback callback, @NonNull final int requestCode) { - final int writePermission = ActivityCompat - .checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); - final int cameraPermission = ActivityCompat + int selfCheckResult = 0; + switch (requestCode) { + case REQUEST_PERMISSIONS_FOR_CAMERA: + selfCheckResult = ActivityCompat .checkSelfPermission(activity, Manifest.permission.CAMERA); + if (selfCheckResult == PackageManager.PERMISSION_GRANTED) { + selfCheckResult = ActivityCompat + .checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + break; + case REQUEST_PERMISSIONS_FOR_LIBRARY: + selfCheckResult = ActivityCompat + .checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); + break; + } - final boolean permissionsGrated = writePermission == PackageManager.PERMISSION_GRANTED && - cameraPermission == PackageManager.PERMISSION_GRANTED; - + final boolean permissionsGrated = selfCheckResult == PackageManager.PERMISSION_GRANTED; if (!permissionsGrated) { final Boolean dontAskAgain = ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) && ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA); @@ -598,7 +608,18 @@ public class ImagePickerModule extends ReactContextBaseJavaModule } else { - String[] PERMISSIONS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + List permissions = new ArrayList(); + if (requestCode == REQUEST_PERMISSIONS_FOR_CAMERA ) + { + permissions.add(Manifest.permission.CAMERA); + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (requestCode == REQUEST_PERMISSIONS_FOR_LIBRARY ) + { + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + String[] PERMISSIONS = permissions.toArray(new String[0]); if (activity instanceof ReactActivity) { ((ReactActivity) activity).requestPermissions(PERMISSIONS, requestCode, listener); diff --git a/node_modules/react-native-image-picker/ios/ImagePickerManager.m b/node_modules/react-native-image-picker/ios/ImagePickerManager.m index 28d5870..3f70983 100644 --- a/node_modules/react-native-image-picker/ios/ImagePickerManager.m +++ b/node_modules/react-native-image-picker/ios/ImagePickerManager.m @@ -455,12 +455,19 @@ - (void)imagePickerController:(UIImagePickerController *)picker didFinishPicking } if (videoURL) { // Protect against reported crash - NSError *error = nil; - [fileManager moveItemAtURL:videoURL toURL:videoDestinationURL error:&error]; - if (error) { - self.callback(@[@{@"error": error.localizedFailureReason}]); - return; - } + NSError *error = nil; + + // If we have write access to the source file, move it. Otherwise use copy. + if ([fileManager isWritableFileAtPath:[videoURL path]]) { + [fileManager moveItemAtURL:videoURL toURL:videoDestinationURL error:&error]; + } else { + [fileManager copyItemAtURL:videoURL toURL:videoDestinationURL error:&error]; + } + + if (error) { + self.callback(@[@{@"error": error.localizedFailureReason}]); + return; + } } }