添加用于在Android

时间:2017-02-27 10:28:25

标签: android android-6.0-marshmallow android-permissions

我需要在我的应用程序中拨打电话。但我很困惑如何正确地为Android及更高版本做到这一点。据我所知,我需要调用 requestPermissions ,然后在 onRequestPermissionsResult 中调用结果。但我需要将callNumber存储在它与函数之间的某处。

我真的不确定在Activity中保存电话号码是个好主意,但我没有其他选择。所以我写了这段代码:

  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
    }
}

如果我们将手机保存在活动中,则可能会在处理异步请求时发生变化。我知道它不会被完成,但它可能是一个问题。

我该如何正确地做到这一点?

P.S。 我们称之为的号码可能会改变。不仅如此,还有一个包含数字的列表(recycleView)。用户可以点击每个号码,并且将调用 callDriver 功能。

我害怕这种情况:

  1. 用户点击号码 - >函数 callDriver 执行
  2. callDriver 请求权限。存储第一个号码。
  3. 用户点击另一个电话号码 - >函数 callDriver 执行请求权限并更改存储的数量。第二个号码已存储。
  4. 获得许可。回调已执行,我们拨打第二个号码。
  5. 这就是为什么我们不会打电话给第一个司机。我认为这种情况不会发生。 (用户应该点击这么快。)但最好知道如何正确地做到这一点。

2 个答案:

答案 0 :(得分:0)

另一种方法是,如果保存到您的通话记录中,您将调用任何数字,并且您可以在那里获取数据表单。使用光标

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,您将获得手机号码列表

答案 1 :(得分:0)

您可以使用SharedPreferences保存电话号码。这是代码:

保存电话号码:

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