Pregunta

Estoy usando el siguiente código para hacer una llamada en Android pero me está dando excepción de seguridad ayuda por favor.

 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);

permisos

 <uses-permission android:name="android.permission.CALL_PHONE" />

Excepción

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)
¿Fue útil?

Solución 4

Todo está bien.

i acaba de colocar permisos de llamada etiqueta de la etiqueta antes de la aplicación en el archivo de manifiesto

y bien ahora todo está funcionando.

Otros consejos

Se puede utilizar en lugar de Intent.ACTION_DIAL Intent.ACTION_CALL. Esto demuestra el marcador con el número ya introducido, pero permite al usuario decidir si se debe en realidad a hacer la llamada o no. ACTION_DIAL no requiere el permiso CALL_PHONE.

Esta demo útil para usted ...

El botón de llamada de clic:

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

El permiso de manifiesto:

 <uses-permission android:name="android.permission.CALL_PHONE" />

opción más elegante:

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

El uso del ACTION_DIAL acción en su intención, de esta manera usted no necesita ningún permiso. La razón por la que necesita el permiso con ACTION_CALL es hacer una llamada telefónica sin ninguna acción por parte del usuario.

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

NOTA IMPORTANTE:

Si utiliza Intent.ACTION_CALL debe agregar el permiso CALL_PHONE.

Su okey sólo si no desea que su aplicación muestre en juego Google para las tabletas que no tiene la tarjeta SIM o no tiene un GSM.

EN SU ACTIVIDAD:

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

MANIFIESTO:

<uses-permission android:name="android.permission.CALL_PHONE" />

Así que si no es una característica fundamental para su aplicación, tratar de mantenerse alejado de la adición de permiso CALL_PHONE.

otra solución:

Es para mostrar la aplicación de teléfono con el número escrito en la pantalla, por lo que sólo necesitará usuario que haga clic el botón de llamada:

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

Sin el permiso necesario para esto.

Sólo el simple oneliner sin permisos adicionales necesarios:

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

utilizar este código completa

          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);     

Solicitud de permiso en el manifiesto

<uses-permission android:name="android.permission.CALL_PHONE" />

Para el uso de llamar a este código

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();
}

Permisos:

<uses-permission android:name="android.permission.CALL_PHONE" />

Intención:

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

Permiso en AndroidManifest.xml

<uses-permission android:name="android.permission.CALL_PHONE" />

Código completo:

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();
    }
}

Puede utilizar esta así:

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

Para hacer una llamada usando la actividad de las intenciones, se debe solicitar los permisos adecuados.

Para que incluya utiliza permisos de archivo AndroidManifest.xml.

<uses-permission android:name="android.permission.CALL_PHONE" />

A continuación, incluir el siguiente código en su actividad

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();
}

Para evitar esto - se puede utilizar la GUI para la introducción de permisos. Eclipse cuidar de dónde insertar la etiqueta de permiso y más a menudo entonces no es correcta

En Android para ciertas funcionalidades que necesita para añadir el permiso para el archivo de manifiesto.

  1. Vaya a los Proyectos AndroidManifest.xml
  2. Haga clic en la pestaña Permisos
  3. Haga clic en Agregar
  4. Seleccionar los usos Permiso
  5. Consulte la figura de abajo Introduce Descripción imagen aquí

6.Save el archivo de manifiesto y ejecute su proyecto. Su proyecto ahora debería funcionar como se esperaba.

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

^ La respuesta está en la salida de excepción " requires android.permission.CALL_PHONE ":)

    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();
    }
 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")));
                }

Para llamada de marcador (No hay permiso necesario):

   fun callFromDailer(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_DIAL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Para llamamiento directo de aplicación (permiso necesario):

  fun callDirect(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_CALL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: SecurityException) {
            Toast.makeText(mContext, "Need call permission", Toast.LENGTH_LONG).show()
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Permiso:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top