我需要在我的应用程序中拨打电话。但我很困惑如何正确地为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 功能。
我害怕这种情况:
这就是为什么我们不会打电话给第一个司机。我认为这种情况不会发生。 (用户应该点击这么快。)但最好知道如何正确地做到这一点。
答案 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