2017-11-22 3 views
-2

私は、ContentObserverとサービス(フォアグラウンドで実行)を使用してコールログをバックグラウンドで追跡するアプリケーションを作成しました。 Manifest.permission.CALL_PHONE これは私がクラッシュ:android.permission.READ_CALL_LOGまたはandroid.permission.WRITE_CALL_LOGが必要です一部のデバイスで

if (CallTrackingHelper.isCallPermissionEnabled(appContext)) { 
     val task = OneoffTask.Builder() 
       .setService(CallLogService::class.java) 
       .setExecutionWindow(0, 6) 
       .setTag("call-track") 
       .setRequiredNetwork(Task.NETWORK_STATE_ANY) 
       .setRequiresCharging(false) 
       .setUpdateCurrent(true) 
       .build() 

     val mGcmNetworkManager = GcmNetworkManager.getInstance(appContext) 
     mGcmNetworkManager.schedule(task) 
    } 

をチェックしています許可私はアップロードは私が接触に

fun getCallLog(id: Long, service: CallLogService): ArrayList<CallLogModel> { 
    val callLogList = ArrayList<CallLogModel>() 
    if (!isCallPermissionEnabled(service)) { 
     return callLogList 
    } 
    var mCursor: Cursor? = null 
    try { 
     val args = arrayOf(id.toString()) 
     if (id != 0L) { 
      mCursor = UCApplication 
        .getInstance() 
        .applicationContext 
        .contentResolver 
        .query(
          CallLog.Calls.CONTENT_URI, 
          null, 
          "_id > ? ", 
          args, 
          null 
        ) 
     } else { 
      mCursor = UCApplication 
        .getInstance() 
        .applicationContext 
        .contentResolver 
        .query(
          CallLog.Calls.CONTENT_URI, 
          null, 
          null, 
          null, 
          CallLog.Calls._ID + " DESC" + " LIMIT 200 " 
        ) 
     } 
    } catch (e: SecurityException) { 
     // 
    } 
    // 
    return callLogList 
} 

fun isCallPermissionEnabled(context: Context?): Boolean { 
    if (context == null || ContextCompat.checkSelfPermission(context, PERMISSIONS) 
      != PackageManager.PERMISSION_GRANTED) { 
     return false 
    } 
    return true 
} 
をフェッチサービスで、サーバーに

override fun onRunTask(p0: TaskParams?): Int { 
    val callLogs = CallTrackingHelper.getCallLog(lastSyncedIndex, this) 
    // 
} 

を電話ログgcmtaskserviceを開始しています

まだ私はsecurityExceptionがたくさん出ているので、tryとcatchを追加する必要があります

+0

入手しているセキュリティ例外を貼り付けてください。 – vishalk

+0

java.lang.Exception:許可が拒否されました:プロバイダcom.android.providers.contacts.CallLogProviderをProcessRecord {d34d85f 31295 :(pid = 31295、uid = 10132)から開くにはandroid.permission.READ_CALL_LOGまたはandroid.permission.WRITE_CALL_LOGが必要です。 –

+0

がありますこれらのアクセス許可をマニフェストに追加します –

答えて

0

実行時にアクセス権を要求しましたか?

https://developer.android.com/training/permissions/requesting.html

+0

私はただ私の仕事が許可されているかどうかを確認したいと思っています。 –

+0

どのようなエラーメッセージが表示されますか? – verona1024

+0

java.lang.Exception:許可の否認:ProcessRecordからプロバイダcom.android.providers.contacts.CallLogProviderを開く{d34d85f 31295:(pid = 31295、uid = 10132)にはandroid.permission.READ_CALL_LOGまたはandroid.permission.WRITE_CALL_LOGが必要です –

1

<appication>タグ上であなたのmanifest.xmlにこれを追加します:

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

あなたはで詳細を読むことができます:here

この

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CONTACTS)) { 

    // Show an explanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 

}

チェック

+1

<使用許諾android:name = "android.permission.READ_CALL_LOG" /> これはどちらも同じですが、なぜcall_logの連絡先が必要ですか –

+0

ああ、ありがとうございます。私の間違い申し訳ありません。 –

1

あなたが

GETランタイム許可このようなデバイス> 6.0でタイム許可を実行取得する必要があります:

final String[] NECESSARY_PERMISSIONS = new String[] {Manifest.permission.GET_ACCOUNTS }; 

    if (ContextCompat.checkSelfPermission(DialerHomeActivity.this, 
        Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) { 

     //Permission is granted 

    } else { 

     //ask for permission 

     ActivityCompat.requestPermissions(
       DialerHomeActivity.this, 
       NECESSARY_PERMISSIONS, 123); 
    } 
0

問題であることが確認されたユーザーは、すでに <uses-permission android:name="android.permission.READ_CALL_LOG"></uses-permission> <uses-permission android:name="android.permission.WRITE_CALL_LOG"></uses-permission>

せずにアプリを持っている場合マニフェストし、通話許可または電話許可を与えます。アップデート後に追加された場合は更新後に更新されます。電話/電話の許可は引き続きありますが、通話ログの許可がないため、再度聞く必要はありません。 フレッシュインストールが正常に機能していました

関連する問題