首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问调用日志权限Android 11 (API 30)?

如何访问调用日志权限Android 11 (API 30)?
EN

Stack Overflow用户
提问于 2022-03-10 16:23:06
回答 1查看 516关注 0票数 0

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

这是“宣言”

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-10 19:33:40

有了这个许可,下面的方法,Android读取声明并从Android 6+工作

代码语言:javascript
复制
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;
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71427493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档