解决错误:: revoked permission android.permission.CALL_PHONE

提兵百万西湖上,立马吴山第一峰!这篇文章主要讲述解决错误:: 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


    推荐阅读