Как сделать телефонный звонок, используя намерение в Android?

Я использую следующий код для звонка на Android, но он дает мне исключение безопасности, пожалуйста, помогите.

posted_by = "111-333-222-4"; String uri = "tel:" + posted_by.trim() ; Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(uri)); startActivity(intent); 

разрешений

   

исключение

 11-25 14:47:01.661: ERROR/AndroidRuntime(302): Uncaught handler: thread main exiting due to uncaught exception 11-25 14:47:01.681: ERROR/AndroidRuntime(302): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:111-333-222-4 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{43d32508 302:com.Finditnear/10026} (pid=302, uid=10026) requires android.permission.CALL_PHONE 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.os.Parcel.readException(Parcel.java:1218) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.os.Parcel.readException(Parcel.java:1206) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1214) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Activity.startActivityForResult(Activity.java:2749) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.app.Activity.startActivity(Activity.java:2855) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.Finditnear.PostDetail$2$1$1$1.onClick(PostDetail.java:604) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.ListView.performItemClick(ListView.java:3285) 11-25 14:47:01.681: ERROR/AndroidRuntime(302): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640) 

    Вы можете использовать Intent.ACTION_DIAL вместо Intent.ACTION_CALL . Это показывает дозвонщик с уже введенным номером, но позволяет пользователю решить, действительно ли делать вызов или нет. ACTION_DIAL не требует разрешения CALL_PHONE .

    Эта демонстрация поможет вам …

    На кнопке вызова нажмите:

     Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number")); startActivity(intent); 

    Разрешение в манифесте:

       

    Более элегантный вариант:

     String phone = "+34666777888"; Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null)); startActivity(intent); 

    Все отлично.

    я только что разместил тег разрешений для вызовов до тега приложения в файле манифеста

    и теперь все работает нормально.

    Используйте действие ACTION_DIAL в своем намерении, таким образом, вам не понадобится какое-либо разрешение. Причина, по которой вам требуется разрешение с ACTION_CALL, – это сделать телефонный звонок без каких-либо действий со стороны пользователя.

     Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:0987654321")) startActivity(intent); 

    Просто простой oneliner без каких-либо дополнительных разрешений:

     private void dialContactPhone(final String phoneNumber) { startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null))); } 

    используйте этот полный код

      Intent callIntent = new Intent(Intent.ACTION_DIAL); callIntent.setData(Uri.parse("tel:"+Uri.encode(PhoneNum.trim()))); callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(callIntent); 

    Запрос разрешения в манифесте

      

    Для вызова используйте этот код

     Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:99xxxxxxxx")); try { startActivity(in); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(mcontext, "Could not find an activity to place the call.", Toast.LENGTH_SHORT).show(); } 

    ВАЖНАЯ ЗАМЕТКА:

    Если вы используете Intent.ACTION_CALL вы должны добавить разрешение CALL_PHONE .

    Его okey только, если вы не хотите, чтобы ваше приложение отображалось для планшетов, которые не принимают SIM-карту или не имеют GSM.

    В ВАШЕЙ ДЕЯТЕЛЬНОСТИ:

      Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER)); startActivity(callIntent); 

    МАНИФЕСТ:

      

    Поэтому, если это не критическая функция для вашего приложения, старайтесь держаться подальше от добавления разрешения CALL_PHONE .

    ПРОЧИЕ РЕШЕНИЯ:

    Является ли показать приложение «Телефон» с номером, записанным на экране, поэтому пользователю нужно будет только нажать кнопку вызова:

      Intent dialIntent = new Intent(Intent.ACTION_DIAL); dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER)); startActivity(dialIntent); 

    Для этого не требуется никакого разрешения.

    Разрешения:

      

    Намерение:

     Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:0377778888")); startActivity(callIntent); 

    Вы также можете использовать это:

     String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", ""); 

    Разрешение в AndroidManifest.xml

      

    Полный код:

     private void onCallBtnClick(){ if (Build.VERSION.SDK_INT < 23) { phoneCall(); }else { if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { phoneCall(); }else { final String[] PERMISSIONS_STORAGE = {Manifest.permission.CALL_PHONE}; //Asking request Permissions ActivityCompat.requestPermissions(mActivity, PERMISSIONS_STORAGE, 9); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { boolean permissionGranted = false; switch(requestCode){ case 9: permissionGranted = grantResults[0]== PackageManager.PERMISSION_GRANTED; break; } if(permissionGranted){ phoneCall(); }else { Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show(); } } private void phoneCall(){ if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:12345678900")); mActivity.startActivity(callIntent); }else{ Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show(); } } 

    Чтобы этого избежать, можно использовать GUI для ввода разрешений. Eclipse позаботится о том, где вставить метку разрешения, и чаще всего это не так.

    В Android для определенных функций вам нужно добавить разрешение в файл манифеста.

    1. Перейдите в проект AndroidManifest.xml
    2. Нажмите вкладку «Разрешения»
    3. Нажмите «Добавить»
    4. Выберите разрешение на использование
    5. См. Снимок ниже. введите описание изображения здесь

    6. Сохраните файл манифеста, а затем запустите проект. Ваш проект теперь должен работать как ожидалось.

     11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE 

    ^ Ответ лежит на выходе исключения ” requires android.permission.CALL_PHONE ” 🙂

      if(ContextCompat.checkSelfPermission( mContext,android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{android.Manifest.permission.CALL_PHONE}, 0); } else { startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Number"))); } 

    Для совершения вызова с использованием намерений вы должны запросить соответствующие разрешения.

    Для этого вы включаете разрешения на использование в файле AndroidManifest.xml.

      

    Затем включите в свою деятельность следующий код

     if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { //Creating intents for making a call Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:123456789")); mActivity.startActivity(callIntent); }else{ Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show(); } 
      final public void Call(View view){ try { EditText editt=(EditText)findViewById(R.id.ed1); String str=editt.getText().toString(); Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+str)); startActivity(intent); } catch (android.content.ActivityNotFoundException e){ Toast.makeText(getApplicationContext(),"App failed",Toast.LENGTH_LONG).show(); } 

    Я думаю, вам просто нужно добавить разрешение в свой манифест:

      

    это избавит вас от исключения безопасности.

    Давайте будем гением компьютера.