2011-03-08 18 views
20

Quiero llamar a un número dado en un cuadro de texto, pero estoy consiguiendo el error:Android App para llamar a un número en el botón haga clic

The application 'xyz'(process com.android) has stopped unexpectedly

La siguiente es mi código. ¿A dónde va mal?

EditText txtPhn; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button callButton = (Button)findViewById(R.id.btnCall); 
    txtPhn = (EditText)findViewById(R.id.txtPhnNumber); 
    callButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      try { 
        Intent callIntent = new Intent(Intent.ACTION_CALL); 
        callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString())); 
        startActivity(callIntent); 
       } catch (ActivityNotFoundException activityException) { 
        Log.e("Calling a Phone Number", "Call failed", activityException); 
       } 
     } 
    }); 
} 

EDITADO LogCat

03-09 11:23:25.874: ERROR/AndroidRuntime(370): FATAL EXCEPTION: main 
03-09 11:23:25.874: ERROR/AndroidRuntime(370): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{40738d70 370:org.krish.android/10034} (pid=370, uid=10034) requires android.permission.CALL_PHONE 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Parcel.readException(Parcel.java:1322) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Parcel.readException(Parcel.java:1276) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Activity.startActivityForResult(Activity.java:2827) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.Activity.startActivity(Activity.java:2933) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at org.krish.android.caller$1.onClick(caller.java:29) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.view.View.performClick(View.java:2485) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.view.View$PerformClick.run(View.java:9080) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Handler.handleCallback(Handler.java:587) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.os.Looper.loop(Looper.java:123) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-09 11:23:25.874: ERROR/AndroidRuntime(370):  at dalvik.system.NativeStart.main(Native Method)`enter code here` 
+0

declaras permiso en el archivo de manifiesto? –

+0

tengo que agregar esa etiqueta en mi archivo manifiesto ...a continuación, también el mismo problema – FosterZ

+0

en el dispositivo que está probando y publicar la salida de registro – ingsaurabh

Respuesta

18

Asegúrese de que ha añadido la etiqueta <uses-permission ... /> a un nivel correcto en el archivo AndroidManifest.xml ( fuera de la etiqueta <application ... /> pero dentro de la etiqueta <manifest ... />):

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dbm.pkg" 
    android:versionCode="1" 
    android:versionName="1.0"> 

    <!-- NOTE! Your uses-permission must be outside the "application" tag 
       but within the "manifest" tag. --> 

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

    <application 
     android:icon="@drawable/icon" 
     android:label="@string/app_name"> 

     <!-- Insert your other stuff here --> 

    </application> 

    <uses-sdk android:minSdkVersion="9" /> 
</manifest> 
2

Es posible que desee probar el siguiente enfoque:

Intent callIntent = new Intent(Intent.ACTION_CALL); 
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString())); 
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(callIntent); 

es decir, agregando la llamada a la función callIntent.setFlags(...).

0

Trate de añadir trim():

callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString().trim())); 
+0

@ Peter-not worked .. – FosterZ

10

Hay dos intentos de llamada/empieza a llamar: ACTION_CALL y ACTION_DIAL.

ACTION_DIAL solo abrirá el marcador con el número introducido, pero le permite al usuario llamar o rechazar la llamada. ACTION_CALL llamará inmediatamente al número y requiere un permiso adicional.

Así que asegúrese de que tiene el permiso

uses-permission android:name="android.permission.CALL_PHONE" 

en su AndroidManifest.xml

+0

sí he agregado este permiso 'uses-permission android: name =" android.permission.CALL_PHONE "' ya ... – FosterZ

+0

entonces realmente necesita comenzar la depuración. Mire la vista ddms en Eclipse: debería ver la pila de pila real. Podría ser una NullPointerException en algún lugar ... –

+0

he notado algo nuevo, copié lo mismo pegado en NetBeans y funcionó perfectamente ... aún no estoy recibiendo el problema con eclipse ... – FosterZ

0

Probablemente necesites probarlo en un dispositivo real. Enfrenté el mismo problema y funcionó en el dispositivo real. Las llamadas y el GPS a veces no funcionan como se esperaba en AVD.

2

API 24

Intent intent = new Intent(Intent.ACTION_CALL); 
    intent.setData(Uri.parse("tel:+94720999666")); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    startActivity(intent); 

y también añadir

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

El problema es que usted no solicitó el permiso del usuario. Si el dispositivo ejecuta Android 6.0 (API nivel 23) y targetSdkVersion de la aplicación es 23 o superior, el permiso de la llamada se considerará como un permiso peligroso. Por lo tanto, primero debe obtener el permiso correcto. En primer lugar, añadir

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.android.app.myapp" > 
     <uses-permission android:name="android.permission.CALL_PHONE" /> 
     ... 
    </manifest> 

en su archivo AndroidManifest.xml.

Luego, tengo un método llamado al hacer clic en un botón.

public void onCall(View view) { 
      Intent callIntent = new Intent(Intent.ACTION_CALL); //use ACTION_CALL class 
      callIntent.setData(Uri.parse("tel:0800000000")); //this is the phone number calling 
      //check permission 
      //If the device is running Android 6.0 (API level 23) and the app's targetSdkVersion is 23 or higher, 
      //the system asks the user to grant approval. 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
       //request permission from user if the app hasn't got the required permission 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.CALL_PHONE}, //request specific permission from user 
         10); 
       return; 
      }else {  //have got permission 
       try{ 
        startActivity(callIntent); //call activity and make phone call 
       } 
       catch (android.content.ActivityNotFoundException ex){ 
        Toast.makeText(getApplicationContext(),"yourActivity is not founded",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
Cuestiones relacionadas