diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index e8babf95f..f68b86328 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -276,6 +276,16 @@
android:readPermission="org.tasks.READ"
android:writePermission="org.tasks.WRITE" />
+
+
+
+
showFromIntent(filePath, fileType));
} else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) {
try {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- Uri uri = Uri.fromFile(new File(filePath));
- intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- intent.setDataAndType(uri, TaskAttachment.FILE_TYPE_IMAGE + "*");
- if (atLeastLollipop()) {
- intent.setClipData(ClipData.newRawUri(null, uri));
- }
+ Intent intent = FileHelper.getReadableActionView(context, filePath, TaskAttachment.FILE_TYPE_IMAGE + "*");
getActivity().startActivity(intent);
} catch(ActivityNotFoundException e) {
Timber.e(e, e.getMessage());
@@ -247,9 +237,7 @@ public class FilesControlSet extends TaskEditControlFragment {
private void showFromIntent(String file, String type) {
try {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(new File(file)), type);
- intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ Intent intent = FileHelper.getReadableActionView(context, file, type);
getActivity().startActivity(intent);
} catch (ActivityNotFoundException e) {
Timber.e(e, e.getMessage());
diff --git a/src/main/java/com/todoroo/astrid/notes/CommentsController.java b/src/main/java/com/todoroo/astrid/notes/CommentsController.java
index fad5a5625..bb1e1ad76 100644
--- a/src/main/java/com/todoroo/astrid/notes/CommentsController.java
+++ b/src/main/java/com/todoroo/astrid/notes/CommentsController.java
@@ -9,6 +9,7 @@ import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
+import android.support.v4.content.FileProvider;
import android.text.Html;
import android.text.Spanned;
import android.text.format.DateUtils;
@@ -27,8 +28,10 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity;
import org.tasks.R;
+import org.tasks.files.FileHelper;
import org.tasks.preferences.Preferences;
+import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
@@ -139,8 +142,11 @@ public class CommentsController {
commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height));
view.setOnClickListener(v -> {
+ File file = new File(updateBitmap.getPath());
+ Uri uri = FileProvider.getUriForFile(activity, "org.tasks.files", file.getAbsoluteFile());
Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(updateBitmap, "image/*");
+ intent.setDataAndType(uri, "image/*");
+ FileHelper.grantReadPermissions(activity, intent, uri);
activity.startActivity(intent);
});
} else {
diff --git a/src/main/java/org/tasks/activities/CameraActivity.java b/src/main/java/org/tasks/activities/CameraActivity.java
index bd86d820a..167a91501 100644
--- a/src/main/java/org/tasks/activities/CameraActivity.java
+++ b/src/main/java/org/tasks/activities/CameraActivity.java
@@ -1,11 +1,13 @@
package org.tasks.activities;
import android.annotation.SuppressLint;
-import android.content.ClipData;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
+import android.support.v4.content.FileProvider;
import android.widget.Toast;
import org.tasks.R;
@@ -15,6 +17,7 @@ import org.tasks.preferences.Preferences;
import java.io.File;
import java.io.IOException;
+import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
@@ -47,12 +50,19 @@ public class CameraActivity extends InjectingAppCompatActivity {
Toast.makeText(this, R.string.external_storage_unavailable, Toast.LENGTH_LONG).show();
} else {
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- Uri uri = Uri.fromFile(output);
- intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ Uri uri = FileProvider.getUriForFile(this, "org.tasks.files", output);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
if (atLeastLollipop()) {
- intent.setClipData(ClipData.newRawUri(null, uri));
+ intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ } else {
+ List resolveInfoList = getPackageManager()
+ .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+ for (ResolveInfo resolveInfo : resolveInfoList) {
+ grantUriPermission(
+ resolveInfo.activityInfo.packageName,
+ uri,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ }
}
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
diff --git a/src/main/java/org/tasks/files/FileHelper.java b/src/main/java/org/tasks/files/FileHelper.java
index c16119b05..44e5b46ee 100644
--- a/src/main/java/org/tasks/files/FileHelper.java
+++ b/src/main/java/org/tasks/files/FileHelper.java
@@ -1,9 +1,19 @@
package org.tasks.files;
import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
+import android.support.v4.content.FileProvider;
+
+import java.io.File;
+import java.util.List;
+
+import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
public class FileHelper {
public static String getPathFromUri(Activity activity, Uri uri) {
@@ -19,4 +29,31 @@ public class FileHelper {
return uri.getPath();
}
}
+
+ public static Intent getReadableActionView(Context context, String path, String type) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ Uri uri = FileProvider.getUriForFile(context, "org.tasks.files", new File(path));
+ intent.setDataAndType(uri, type);
+ grantReadPermissions(context, intent, uri);
+ return intent;
+ }
+
+ public static void grantReadPermissions(Context context, Intent intent, Uri uri) {
+ if (atLeastLollipop()) {
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ } else {
+ if (atLeastLollipop()) {
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ } else {
+ List resolveInfoList = context.getPackageManager()
+ .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+ for (ResolveInfo resolveInfo : resolveInfoList) {
+ context.grantUriPermission(
+ resolveInfo.activityInfo.packageName,
+ uri,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ }
+ }
+ }
+ }
}
diff --git a/src/main/res/xml/file_provider_paths.xml b/src/main/res/xml/file_provider_paths.xml
new file mode 100644
index 000000000..ffa74ab56
--- /dev/null
+++ b/src/main/res/xml/file_provider_paths.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file