我需要访问Android (API 30)调用日志,在我的应用程序中,下面有这个方法,但是抛出异常,需要允许:android.permission.READ_CALL_LOG或android.permission.WRITE_CALL_LOG

这是“宣言”
<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.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />这是函数Java:
public static String obtenerDetallesLlamadas(Context context) {
StringBuffer stringBuffer = new StringBuffer();
Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI,
null, null, null, CallLog.Calls.DATE + " DESC");
int number = cursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = cursor.getColumnIndex(CallLog.Calls.TYPE);
int date = cursor.getColumnIndex(CallLog.Calls.DATE);
int duration = cursor.getColumnIndex(CallLog.Calls.DURATION);
while (cursor.moveToNext()) {
String phNumber = cursor.getString(number);
String callType = cursor.getString(type);
String callDate = cursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
String callDuration = cursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
stringBuffer.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- "
+ dir + " \nCall Date:--- " + callDayTime
+ " \nCall duration in sec :--- " + callDuration);
stringBuffer.append("\n----------------------------------");
}
cursor.close();
return stringBuffer.toString();
}发布于 2022-03-10 19:33:40
有了这个许可,下面的方法,Android读取声明并从Android 6+工作
public static boolean comprobar_Permisos_CALL_LOG(Context myContext, Activity myActivity){
try {
// Check whether this app has the call log allowed
int writeExternalStoragePermission = ContextCompat.checkSelfPermission(myContext, Manifest.permission.READ_CALL_LOG);
if(writeExternalStoragePermission!= PackageManager.PERMISSION_GRANTED)
{
// Request user to grant write external storage permission.
ActivityCompat.requestPermissions(myActivity, new String[]{
Manifest.permission.READ_CALL_LOG
}, REQUEST_CODE_CALL_LOG_PERMISSION);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R ) {
try {
Intent intent = new Intent();
Uri uri = Uri.fromParts("package", myActivity.getPackageName(), null);
intent.setData(uri);
myActivity.startActivityForResult(intent,REQUEST_CODE_CALL_LOG_PERMISSION);
return false;
} catch (Exception e) {
return false; //if anything needs adjusting it would be this
}
} else {
return false;
}
}else {
return true;
}
}catch (Exception ex)
{
Log.e(LOG_TAG_EXTERNAL_STORAGE, ex.getMessage(), ex);
}
return false;
} https://stackoverflow.com/questions/71427493
复制相似问题