zerox1212
zerox1212

Reputation: 166

java.lang.SecurityException with No Details

I searched around for this but couldn't find a solution to my case. I just updated my app to target Android API 25. Thus I had to update permission handling. My app requires the following permissions:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />

I have added all the code to check/request permissions and tested it on two different phones. However a few users are getting this crash:

java.lang.RuntimeException: 
  at android.os.AsyncTask$3.done (AsyncTask.java:318)
  at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354)
  at java.util.concurrent.FutureTask.setException (FutureTask.java:223)
  at java.util.concurrent.FutureTask.run (FutureTask.java:242)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
  at java.lang.Thread.run (Thread.java:762)
Caused by: java.lang.SecurityException: 
  at android.os.Parcel.readException (Parcel.java:1693)
  at android.os.Parcel.readException (Parcel.java:1646)
  at android.app.ActivityManagerProxy.getContentProvider (ActivityManagerNative.java:4912)
  at android.app.ActivityThread.acquireProvider (ActivityThread.java:6043)
  at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider (ContextImpl.java:2474)
  at android.content.ContentResolver.acquireUnstableProvider (ContentResolver.java:1521)
  at android.content.ContentResolver.query (ContentResolver.java:520)
  at android.content.CursorLoader.loadInBackground (CursorLoader.java:64)
  at android.content.CursorLoader.loadInBackground (CursorLoader.java:56)
  at android.content.AsyncTaskLoader.onLoadInBackground (AsyncTaskLoader.java:312)
  at android.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:69)
  at android.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:66)
  at android.os.AsyncTask$2.call (AsyncTask.java:304)
  at java.util.concurrent.FutureTask.run (FutureTask.java:237)

As you can see I'm getting a security exception with no details. Also the stack trace shows that it doesn't originate from my code at all.

Can anyone tell me how to troubleshoot this? Am I reading the stack trace wrong?

EDIT: The problem must originate from trying to build a list of user emails from contacts. Here is the code:

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    return new CursorLoader(this,
            // Retrieve data rows for the device user's 'profile' contact.
            Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                    ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,

            // Select only email addresses.
            ContactsContract.Contacts.Data.MIMETYPE +
                    " = ?", new String[]{ContactsContract.CommonDataKinds.Email
            .CONTENT_ITEM_TYPE},

            // Show primary email addresses first. Note that there won't be
            // a primary email address if the user hasn't specified one.
            ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    List<String> emails = new ArrayList<>();
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        emails.add(cursor.getString(ProfileQuery.ADDRESS));
        cursor.moveToNext();
    }

    addEmailsToAutoComplete(emails);
}

Upvotes: 2

Views: 622

Answers (1)

zerox1212
zerox1212

Reputation: 166

I found out what was happening. In my code there was a more obscure place calling this:

getLoaderManager().initLoader(0, null, this);

The solution was to do normal permission checks before getting user contact data.

It turns out that Google Play Console will not show the security exception details in it's stack trace. You can only see the actual required permission in debug mode.

Upvotes: 1

Related Questions