diff --git a/acra/src/main/java/org/acra/annotation/ReportsCrashes.java b/acra/src/main/java/org/acra/annotation/ReportsCrashes.java index 642bb07b4..9ab49c1f7 100644 --- a/acra/src/main/java/org/acra/annotation/ReportsCrashes.java +++ b/acra/src/main/java/org/acra/annotation/ReportsCrashes.java @@ -660,4 +660,10 @@ * @since 4.9.3 */ @NonNull Class attachmentUriProvider() default DefaultAttachmentProvider.class; + + /** + * + * @return if the report should be an attachment instead of plain text. Supported for email mode. + */ + boolean reportAsFile() default false; } diff --git a/acra/src/main/java/org/acra/attachment/AcraContentProvider.java b/acra/src/main/java/org/acra/attachment/AcraContentProvider.java index 70c176af1..1a0c4554b 100644 --- a/acra/src/main/java/org/acra/attachment/AcraContentProvider.java +++ b/acra/src/main/java/org/acra/attachment/AcraContentProvider.java @@ -18,7 +18,6 @@ import android.content.ContentProvider; import android.content.ContentValues; -import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; @@ -48,23 +47,19 @@ public class AcraContentProvider extends ContentProvider { private static final String[] COLUMNS = { OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}; - private static final String ANY_MATCH = "/*"; - private UriMatcher uriMatcher; + private String authority; @Override public boolean onCreate() { - final String authority = getContext().getPackageName() + ".acra"; + authority = getContext().getPackageName() + ".acra"; if (ACRA.DEV_LOGGING) ACRA.log.d(ACRA.LOG_TAG, "Registered content provider for authority " + authority); - uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); - for (Directory directory : Directory.values()) { - uriMatcher.addURI(authority, directory.name().toLowerCase() + ANY_MATCH, directory.ordinal()); - } return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { + if (ACRA.DEV_LOGGING) ACRA.log.d(ACRA.LOG_TAG, "Query: " + uri); final File file = getFileForUri(uri); if (file == null) { return null; @@ -87,8 +82,7 @@ public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable S @Nullable private File getFileForUri(Uri uri) { - final int match = uriMatcher.match(uri); - if (match == UriMatcher.NO_MATCH) { + if(!"content".equals(uri.getScheme()) || !authority.equals(uri.getAuthority())){ return null; } final List segments = new ArrayList(uri.getPathSegments()); @@ -129,10 +123,10 @@ public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable St public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException { final File file = getFileForUri(uri); if (file == null || !file.exists()) throw new FileNotFoundException("File represented by uri " + uri + " could not be found"); - if(ACRA.DEV_LOGGING) { + if (ACRA.DEV_LOGGING) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { ACRA.log.d(ACRA.LOG_TAG, getCallingPackage() + " opened " + file.getPath()); - }else { + } else { ACRA.log.d(ACRA.LOG_TAG, file.getPath() + " was opened by an application"); } } diff --git a/acra/src/main/java/org/acra/sender/EmailIntentSender.java b/acra/src/main/java/org/acra/sender/EmailIntentSender.java index 5501f5367..6df0a8955 100644 --- a/acra/src/main/java/org/acra/sender/EmailIntentSender.java +++ b/acra/src/main/java/org/acra/sender/EmailIntentSender.java @@ -33,9 +33,12 @@ import org.acra.collections.ImmutableSet; import org.acra.collector.CrashReportData; import org.acra.config.ACRAConfiguration; +import org.acra.file.CrashReportPersister; import org.acra.model.Element; import org.acra.util.InstanceCreator; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -65,6 +68,16 @@ public void send(@NonNull Context context, @NonNull CrashReportData errorContent final String body = buildBody(errorContent); final InstanceCreator instanceCreator = new InstanceCreator(); final ArrayList attachments = instanceCreator.create(config.attachmentUriProvider(), new DefaultAttachmentProvider()).getAttachments(context, config); + boolean contentAttached = false; + if (config.reportAsFile()) { + final File cache = new File(context.getCacheDir(), "ACRA-report" + ACRAConstants.REPORTFILE_EXTENSION); + try { + new CrashReportPersister().store(errorContent, cache); + attachments.add(Uri.parse("content://" + context.getPackageName() + ".acra/root" + cache.getPath())); + contentAttached = true; + } catch (IOException ignored) { + } + } final Intent resolveIntent = new Intent(android.content.Intent.ACTION_SENDTO); resolveIntent.setData(Uri.fromParts("mailto", config.mailTo(), null)); @@ -81,7 +94,7 @@ public void send(@NonNull Context context, @NonNull CrashReportData errorContent emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{config.mailTo()}); emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); - emailIntent.putExtra(Intent.EXTRA_TEXT, body); + if (!contentAttached) emailIntent.putExtra(Intent.EXTRA_TEXT, body); emailIntent.setType("message/rfc822"); emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachments); if (packageName.equals("android")) {