在 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 将被调用。
我害怕这种情况:
- 用户点击数字 -> 函数 callDriver 执行
- callDriver 请求权限。已存储第一个号码。
- 用户点击另一个 phone 号码 -> 函数 callDriver 执行请求权限并更改存储的号码。已存储第二个号码。
- 已授予权限。执行回调,我们调用第二个号码。
这就是为什么我们不会调用第一个 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
我需要在我的应用程序中调用 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 将被调用。
我害怕这种情况:
- 用户点击数字 -> 函数 callDriver 执行
- callDriver 请求权限。已存储第一个号码。
- 用户点击另一个 phone 号码 -> 函数 callDriver 执行请求权限并更改存储的号码。已存储第二个号码。
- 已授予权限。执行回调,我们调用第二个号码。
这就是为什么我们不会调用第一个 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