0

나는이 문제를 조사했지만 내 사건의 해결책을 찾지 못했습니다. 방금 Android API 25를 타겟팅하도록 앱을 업데이트했습니다. 따라서 권한 처리를 업데이트해야했습니다. 내가/요청 권한을 확인하기 위해 모든 코드를 추가하고 두 개의 서로 다른 휴대폰에서이를 테스트 한세부 정보가없는 java.lang.SecurityException

<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" /> 

: 내 응용 프로그램은 다음과 같은 권한이 필요합니다. 그러나 일부 사용자는이 충돌을 얻고있다 :

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) 

당신은 내가 더 세부 보안 예외를 받고 있어요 볼 수 있듯이. 또한 스택 추적은 내 코드에서 전혀 발생하지 않았 음을 보여줍니다.

누구든지이 문제를 해결하는 방법을 알려 줄 수 있습니까? 스택 추적을 잘못 읽었습니까?

편집 : 문제는 연락처에서 사용자 이메일 목록을 작성하는 데 기인 한 것이어야합니다. 다음은 코드입니다.

@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); 
} 
+0

질문에 더 많은 세부 정보 추가, 스택 추적이 불완전한 것 같습니다 – Akhil

+0

앱에'CursorLoader'를 사용합니까? – CommonsWare

+0

내 코드는'CursorLoader'를 사용하여 연락처로부터 사용자 이메일을 채 웁니다. – zerox1212

답변

0

어떤 일이 발생했는지 알았습니다. 내 코드에는 더 불분명 한 곳이있었습니다.

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

해결 방법은 사용자 연락처 데이터를 받기 전에 정상적인 권한 검사를 수행하는 것이 었습니다.

Google Play 콘솔은 스택 추적에 보안 예외 세부 정보를 표시하지 않습니다. 실제 필수 권한은 디버그 모드에서만 볼 수 있습니다.