在 Android 中添加请求权限的选项

Add option for requesting permission in Android

我需要在我的应用程序中调用 phone。但我很困惑如何为 Android 及更高版本正确执行此操作。据我了解,我需要调用 requestPermissions 然后在 onRequestPermissionsResult 中处理结果。但是我需要将 callNumber 存储在函数之间的某处。

我真的不确定在 Activity 中保存 phone 号码是个好主意,但我别无选择。所以我写了这段代码:

  public void callDriver(String phoneNumber) {
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse(String.format("tel:+%s", phoneNumber)));
    //FIXME: we need to save driver for calling in callback
    phoneNumberForCall = phoneNumber; //potential problem
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                                          new String[]{Manifest.permission.CALL_PHONE},
                                          TaxiApp.MY_PERMISSIONS_REQUEST_CALL_PHONE);
    } else {
        startActivity(callIntent);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case TaxiApp.MY_PERMISSIONS_REQUEST_CALL_PHONE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse(String.format("tel:+%s", phoneNumberForCall)));
                startActivity(callIntent);

            } else {

                Toast.makeText(this, getString(R.string.no_call_permission), Toast.LENGTH_LONG).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

如果我们在 activity 中保存 phone 它可能会在处理异步请求时发生变化&我知道它不会完成,但这可能是一个问题。

我应该怎样做才正确?

P.S. 我们呼叫的号码可能会改变。不仅如此,还有一个带有数字的列表(recycleView)。用户可以点击每个号码,函数 callDriver 将被调用。

我害怕这种情况:

  1. 用户点击数字 -> 函数 callDriver 执行
  2. callDriver 请求权限。已存储第一个号码。
  3. 用户点击另一个 phone 号码 -> 函数 callDriver 执行请求权限并更改存储的号码。已存储第二个号码。
  4. 已授予权限。执行回调,我们调用第二个号码。

这就是为什么我们不会调用第一个 driver。我认为这种情况永远不会发生。 (用户应该为此点击太快。)但最好知道如何正确执行此操作。

另一种方法是,如果将保存到您的通话记录中,您将拨打的任何号码都可以从那里获取数据。使用光标

Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);

while (managedCursor.moveToNext()) {

String phNumber = managedCursor.getString(number);
String callType = managedCursor.getString(type);

int dircode = Integer.parseInt(callType);

 switch (dircode) {

case CallLog.Calls.OUTGOING_TYPE:
//write your code here 
break;

}

}

然后关闭光标obj,你会得到手机号码列表

您可以使用 SharedPreferences 来保存 phone 号码。这是代码:

正在保存 phone 号码:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); 
SharedPreferences.Editor ed = prefs.edit();
ed.putString(KEY_PHONE_NUMBER_FOR_CALL, phoneNumber);
// ed.commit() can also be used but it is synchronous while ed.apply() is asynchronous.
ed.apply();

正在检索:

String phoneNumberForCall = prefs.getString(KEY_PHONE_NUMBER_FOR_CALL, defaultValue);

文档:https://developer.android.com/training/basics/data-storage/shared-preferences.html