2016-03-28 38 views
-1

私は奇妙な権限の問題を扱っています。権限の拒否 - 権限が機能しません。

私は連絡先、SMS、通話ログを読み取るしようとしていて、そのために、私は私のマニフェストでこれらの権限を使用しています:

<uses-permission android:name="android.permission.WRITE_CALL_LOG" /> 
<uses-permission android:name="android.permission.READ_CALL_LOG" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 

私は最初のSMSを読み始めたとき、それが働きました。それから私は連絡先を試してみましたが、READ_CONTACTSパーミッションが必要であることを伝えるエラーメッセージが表示されました。私はこのプロジェクトをきれいにしてから働きました。しかし、SMS、連絡先、通話履歴など、何も機能しません。私は、プロジェクトをきれいにし、それを再構築し、まだ何もしていない。

私のGradleのビルド:

android { 
    compileSdkVersion 23 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "com.xyz" 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 

は、私が始まるSMSの読み取りで言ったように私は今、それは私がコールログのアクセス許可を削除した場合でもありません、minSdkVerionまたはcompileSdkVersionが問題である働いたとは思いません。

いくつかのコード行:

public void backUpContacts() { 
    String[] dataContacts = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone._ID}; 
    Cursor cursor = this.mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, dataContacts, null, null, null); 
    JSONObject jsonContacts; 
    JSONArray jsonArray = new JSONArray(); 

    while (cursor != null && cursor.moveToNext()) { 
     jsonContacts = new JSONObject(); 
     for (int i = 0; i < cursor.getColumnCount(); i++) { 
      jsonContacts.put(cursor.getColumnName(i), cursor.getString(i)); 
     } 
     contacts = cursor.getColumnCount(); 
     jsonArray.add(jsonContacts); 
    } 


    Log.d("jsonArray", jsonArray.toString()); 
    if (cursor != null) cursor.close(); 
    createFile(jsonArray, "contacts"); 
} 

public void backupSms() { 
    JSONArray listSmsInbox; 
    JSONArray listSmsSent; 

    listSmsInbox = getPhoneSms("content://sms/inbox", "received"); 
    listSmsSent = getPhoneSms("content://sms/sent", "sent"); 

    Log.i("listSmsInbox", listSmsInbox.toString()); 
    Log.i("listSmsSent", listSmsSent.toString()); 
} 

private JSONArray getPhoneSms(String parsing, String param) { 
     Cursor c = this.mContext.getContentResolver().query(Uri.parse(parsing), null, null, null, null); 
     JSONObject jsonSms = new JSONObject(); 
     JSONArray jsonArray = new JSONArray(); 

     while (c != null && c.moveToNext()) { 
      jsonSms = new JSONObject(); 
      for (int i = 0; i < c.getColumnCount(); i++) { 
       jsonSms.put(c.getColumnName(i), c.getString(i)); 
      } 
      jsonArray.add(jsonSms); 

      if (param.equals("received")) { 
       receivedSms = c.getColumnCount(); 
      } else { 
       sentSms = c.getColumnCount(); 
      } 
     } 
     jsonArray.add(jsonSms); 

     if (c != null) c.close(); 
     createFile(jsonArray, param); 

     return jsonArray; 
    } 

私はAsyncTaskでこれらのメソッドを呼んでいる:あなたの助けを

@Override 
    protected Void doInBackground(Void... params) { 
     if (param.equals("contacts")) { 
      backUpContent.backUpContacts(); 
     } else if (param.equals("sms")) { 
      backUpContent.backupSms(); 
     } else if (param.equals("callLogs")) { 
      backUpContent.backUpCallLogs(); 
     } 

     publishProgress(0); 
     return null; 
    } 

ありがとう!

+2

はhttps://stackoverflow.com/questions/32635704/cantを参照してください。 -get-the-permissionを実行し、 'targetSdkVersion'を' 22'に落とすか、コードにランタイム権限のサポートを追加してください。 – CommonsWare

答えて

-1

アクセス許可の順序を前後に移動してください。 Read_Contactsの許可をRead_SMS

+0

''要素の順序は、その使用に関係しません。ルートの ''要素の直接の子である限り、それらの出現順序は重要ではありません。 – CommonsWare

+0

私はこれに気づいていますが、私はそれを修正するために使用した方法で、年に近いか、同様のバグに苦しんでいました。次回は、自動的にダウンする前に質問してください。 – Ethan

+0

問題が解決しました。これはしませんでした。質問を編集し、 ' '要素の順序が重要であることを示す再現可能なテストケースを提供した場合、私は喜んでダウンボントを引き込みます。 – CommonsWare

0

にするようにしてください。特に@CommonsWareに感謝します。私はこのトピックを見つけていない、私は他の人を見つけた(しかし、残念ながら古い)。私はcheckSelfPermission()とrequestPermissions()を使って、onRequestPermissionsResult()をオーバーライドしました。今はうまくいく。私はここに自分のコードを書いているので、その問題を扱っているすべての人がその動作方法を理解できるようになります。ここで

)が(私のonRequestPermissionsResultです:

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_CODE_ASK_PERMISSIONS: // final int variable = 123 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission Granted 
        myMethodHere(); 
        return; 
       } else { 
        // Permission Denied 
        Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT) 
          .show(); 
       } 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

そして、私はすべてのコンテンツプロバイダの前に呼んでいる方法:

int hasReadContactsPermission = checkSelfPermission(mContext, permission); 
     if (hasReadContactsPermission != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(this.activity, new String[]{permission}, 
        REQUEST_CODE_ASK_PERMISSIONS); 
      return; 
     } 
関連する問題