代码仔 2014-12-05 16:28 采纳率: 0%
浏览 758

Android获取未接来电失败

通过点击按钮获取为借来电的信息,并以对话框形式显示未接来电的号码。虚拟机中测试通过,但在真机上运行时会直接强制退出。
代码:

@Override
            public void onClick(View v) {
                final String[] projection = null;
                final String selection = null;
                final String[] selectionArgs = null;
                final String sortOrder = android.provider.CallLog.Calls.DATE + " DESC";
                Cursor cursor = null;
                try {
                    cursor = getContentResolver().query(
                            Uri.parse("content://call_log/calls"), projection,
                            selection, selectionArgs, sortOrder);
                    while (cursor.moveToNext()) {
                        String callLogID = cursor.getString(cursor
                                .getColumnIndex(android.provider.CallLog.Calls._ID));
                        String callNumber = cursor.getString(cursor
                                .getColumnIndex(android.provider.CallLog.Calls.NUMBER));
                        String callDate = cursor.getString(cursor
                                .getColumnIndex(android.provider.CallLog.Calls.DATE));
                        String callType = cursor.getString(cursor
                                .getColumnIndex(android.provider.CallLog.Calls.TYPE));
                        String isCallNew = cursor.getString(cursor
                                .getColumnIndex(android.provider.CallLog.Calls.NEW));
                        if (Integer.parseInt(callType) == (CallLog.Calls.MISSED_TYPE)
                                && Integer.parseInt(isCallNew) > 0) {
                            Toast.makeText(getApplication(),
                                    "Missed Call Found: " + callNumber,
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                finally {
                    cursor.close();
                }
            } 

权限列表中添加的权限为:

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 03:47
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的代码中,你已经成功地使用了ContentResolver来获取电话簿中的呼叫记录信息。但是,在实际的Android应用程序中,你需要确保你有适当的权限才能访问这些数据。以下是一些可能的问题和解决方案:

    1. 权限问题:在你的应用中,你应该检查是否有足够的权限来读取和写入电话簿数据。这通常涉及到调用ContextCompat.checkSelfPermission()方法来检查当前用户是否具有所需的权限。例如:

      @Override
      public void onClick(View v) {
          if (!ContextCompat.checkSelfPermission(this,
                  Manifest.permission.READ_CALL_LOG)
              != PackageManager.PERMISSION_GRANTED) {
              // 请求权限
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.READ_CALL_LOG},
                      MY_PERMISSIONS_REQUEST_READ_CALL_LOG);
          } else {
              // 已经拥有必要的权限
              getContactsData();
          }
      }
      
    2. 权限管理器:如果你的应用需要向用户提供一个选择权来决定他们是否愿意允许你的应用访问他们的电话簿数据,你可以考虑使用权限管理器(Permission Manager)。这是一个内置在Android系统中的工具,可以用来帮助开发者控制用户的权限请求。

    3. 适配不同的设备:确保你在Android 4.4(KitKat)及以上版本中正确处理权限请求。在API 21及之后的版本中,你可以使用ActivityCompat#requestPermissions()方法来实现此功能。然而,对于旧版本的Android,你可能会遇到一些限制。

    4. 错误处理:在尝试执行任何可能导致资源泄露的操作之前,务必进行适当的状态清理。这包括关闭Cursor对象、释放数据库连接等操作。

    5. 安全性和隐私:始终尊重用户的数据保护和隐私。在开发过程中,应该充分考虑如何最小化对用户数据的访问,以及如何防止滥用权限的行为。

    以上是解决上述问题的一些基本策略。根据你的具体需求,你可能还需要进一步调整代码以适应特定的环境或场景。

    评论

报告相同问题?