提兵百万西湖上,立马吴山第一峰!这篇文章主要讲述解决错误:: revoked permission android.permission.CALL_PHONE相关的知识,希望能为你提供帮助。
如何解决这个错误:
撤销权限android.permission.CALL_PHONE【解决错误:: revoked permission android.permission.CALL_PHONE】这是我的java代码:
public class DetailContactActivity extends AppCompatActivity implements
OnClickListener {private TextViewphone, email;
private intid;
private ImageViewcall, btnEmail;
private ContactDBdb;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_contact);
db = ContactDB.getInstance(this);
phone = (TextView) findViewById(R.id.txt_phone_number);
email = (TextView) findViewById(R.id.txt_email);
call = (ImageView) findViewById(R.id.btn_call);
btnEmail = (ImageView) findViewById(R.id.btn_email);
Bundle b = getIntent().getExtras();
if (b != null)
{
id = b.getInt("id");
phone.setText(b.getString("phone"));
getSupportActionBar().setTitle(b.getString("nama"));
if (!b.getString("email").equals("null"))
{
email.setText(b.getString("email"));
} else
{
email.setText("");
}}call.setOnClickListener(this);
btnEmail.setOnClickListener(this);
}@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.detail_contact, menu);
return true;
}@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.action_edit:
Bundle b = new Bundle();
b.putInt("id", id);
b.putString("name", getSupportActionBar().getTitle().toString());
b.putString("email", email.getText().toString());
b.putString("phone", phone.getText().toString());
Intent i = new Intent(this, EditActivity.class);
i.putExtras(b);
startActivity(i);
finish();
return true;
case R.id.action_delete:
showSettingsAlert();
return true;
default:
return super.onOptionsItemSelected(item);
}}@Override
public void onClick(View v)
{
if (v == btnEmail)
{
if (!email.getText().toString().equals(""))
{
Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
Uri.fromParts("mailto", email.getText().toString(),
null));
startActivity(Intent
.createChooser(emailIntent, "Send email..."));
}} else if (v == call)
{
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + phone.getText().toString()));
startActivity(callIntent);
//Uri call = Uri.parse("tel:" + phone.getText().toString());
//Intent surf = new Intent(Intent.ACTION_CALL, call);
//startActivity(surf);
}}private void showSettingsAlert()
{
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Delete");
alert.setMessage("Contact akan dihapus");
alert.setPositiveButton("Ya", new DialogInterface.OnClickListener() {@Override
public void onClick(DialogInterface dialog, int which)
{
db.deleteContact(id);
startActivity(new Intent(DetailContactActivity.this,
MainActivity.class));
finish();
}
});
alert.setNegativeButton("Tidak", new DialogInterface.OnClickListener() {@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
alert.show();
}@Override
public void onBackPressed()
{
super.onBackPressed();
startActivity(new Intent(DetailContactActivity.this, MainActivity.class));
finish();
}
错误:
01-02 02:05:41.493: D/AndroidRuntime(2927): Shutting down VM
01-02 02:05:41.493: D/AndroidRuntime(2927): --------- beginning of crash
01-02 02:05:41.616: E/AndroidRuntime(2927): FATAL EXCEPTION: main
01-02 02:05:41.616: E/AndroidRuntime(2927): Process: com.example.phonedb, PID: 2927
01-02 02:05:41.616: E/AndroidRuntime(2927): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{f5320c4 2927:com.example.phonedb/u0a69} (pid=2927, uid=10069) with revoked permission android.permission.CALL_PHONE
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.os.Parcel.readException(Parcel.java:1599)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.os.Parcel.readException(Parcel.java:1552)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.Activity.startActivityForResult(Activity.java:3917)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.Activity.startActivityForResult(Activity.java:3877)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:748)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.Activity.startActivity(Activity.java:4200)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.Activity.startActivity(Activity.java:4168)
01-02 02:05:41.616: E/AndroidRuntime(2927):at com.example.phonedb.DetailContactActivity.onClick(DetailContactActivity.java:127)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.view.View.performClick(View.java:5198)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.view.View$PerformClick.run(View.java:21147)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.os.Handler.handleCallback(Handler.java:739)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.os.Handler.dispatchMessage(Handler.java:95)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.os.Looper.loop(Looper.java:148)
01-02 02:05:41.616: E/AndroidRuntime(2927):at android.app.ActivityThread.main(ActivityThread.java:5417)
01-02 02:05:41.616: E/AndroidRuntime(2927):at java.lang.reflect.Method.invoke(Native Method)
01-02 02:05:41.616: E/AndroidRuntime(2927):at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-02 02:05:41.616: E/AndroidRuntime(2927):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
这里是清单文件,希望帮助::
<
manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.phonedb"
android:versionCode="1"
android:versionName="1.0" >
<
uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="23" />
<
uses-permission-sdk-m android:name="android.permission.READ_CONTACTS" />
<
uses-permission-sdk-m android:name="android.permission.WRITE_CONTACTS" />
<
uses-permission android:name="android.permission.CAMERA"/>
<
uses-permission android:name="android.permission.INTERNET" />
<
uses-permission android:name="android.permission.CALL_PHONE"/>
<
application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<
activity
android:name="com.example.phonedb.MainActivity"
android:label="@string/app_name" >
<
intent-filter>
<
action android:name="android.intent.action.MAIN" />
<
category android:name="android.intent.category.LAUNCHER" />
<
/intent-filter>
<
/activity>
<
activity
android:name=".AddContactActivity"
android:label="@string/title_activity_add_contact" >
<
/activity>
<
activity
android:name="com.example.phonedb.DetailContactActivity"
android:label="@string/title_activity_detail_contact" >
<
/activity>
<
activity
android:name=".EditActivity"
android:label="@string/title_activity_edit" >
<
/activity>
<
/application>
答案切换到DIAL_PHONE,因为它不需要许可。
只需更换此行即可
Intent callIntent = new Intent(Intent.ACTION_CALL);
至
Intent callIntent = new Intent(Intent.ACTION_DIAL);
另一答案Android 6(SDK 23)允许用户撤消应用程序的权限。我想,那就是这里发生的事情。您的应用必须能够应对这种情况。
详细了解documentation。
特别是:
如果设备运行的是Android 6.0或更高版本,并且您的应用的目标SDK为23或更高:应用必须列出清单中的权限,并且必须在应用运行时请求它所需的每个危险权限。用户可以授予或拒绝每个权限,即使用户拒绝权限请求,应用程序也可以继续以有限的功能运行。在运行时请求权限是qazxsw poi。
另一答案在清单文件中添加此权限:
described in detail here
或者试试这个。
<
uses-permission android:name="android.permission.CALL_PHONE"/>
CALL_PRIVILEGED允许应用程序拨打任何电话号码,包括紧急号码,而无需通过拨号器用户界面,以便用户确认正在拨打电话。不适用于第三方应用程序。另一答案我迟到了。您必须动态请求权限。
<
uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
更多细节在
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.} else {// No explanation needed, we can request the permission.ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
另一答案请更改call_phone以拨打电话。因为你需要拨号码。
https://developer.android.com/training/permissions/requesting.html
推荐阅读
- “无法为Android模拟器创建上下文0x3005”
- 如何使用buildship for android()
- Android(从网格视图中获取价值)
- 在android中夸大类android.support.design.widget.CollapsingToolbarLayout的错误
- 在Android中的旋转木马
- 我如何使Figma API与Google App脚本API一起使用()
- 在循环中使用Realm或在Android中插入列表
- Android - 线程问题(按钮中的随机字符切换,直到单击按钮)
- Android postdelayed处理程序无法启动运行