Domanda

Sto utilizzando il seguente codice per effettuare una chiamata in Android, ma mi sta dando un'eccezione di sicurezza di aiuto per favore.

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

permessi

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

eccezione

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)
È stato utile?

Soluzione 4

Ogni cosa va bene.

Ho appena messo tag autorizzazioni per le chiamate prima di tag applicazione nel file manifesto

e bene ora ogni cosa sta funzionando.

Altri suggerimenti

È possibile utilizzare al posto di Intent.ACTION_DIAL Intent.ACTION_CALL. Questo mostra il dialer con il numero già inseriti, ma permette all'utente di decidere se effettivamente fare la chiamata o meno. ACTION_DIAL non richiede l'autorizzazione CALL_PHONE.

Questa demo sarà utile per voi ...

Il pulsante di chiamata clic:

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

Il permesso in Manifest:

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

opzione più elegante:

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

Utilizzare l'ACTION_DIAL azione nel vostro intento, in questo modo non sarà necessario alcun permesso. Il motivo è necessario il permesso con ACTION_CALL è quello di fare una telefonata senza alcuna azione da parte dell'utente.

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

NOTA IMPORTANTE:

Se si utilizza Intent.ACTION_CALL è necessario aggiungere il permesso CALL_PHONE.

Il suo okey solo se non si desidera la vostra applicazione di presentarsi in gioco Google per i tablet che non prende carta SIM o non ha GSM.

nella vostra attività:

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

PALESE:

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

Quindi, se non è la caratteristica fondamentale per la vostra applicazione, cercare di stare lontano da aggiungere il permesso CALL_PHONE.

Altra soluzione:

è quello di mostrare l'applicazione Telefono con il numero scritto nel sullo schermo, così l'utente avrà solo bisogno di fare clic sul pulsante di chiamata:

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

Nessun permesso necessario per questo.

Basta la semplice oneliner senza autorizzazioni aggiuntive necessarie:

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

utilizzare questo codice completo

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

di richiesta di autorizzazione a manifestare

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

Per l'uso di chiamare questo codice

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

Permessi:

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

Intent:

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

Il permesso in AndroidManifest.xml

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

completo del codice:

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

È possibile utilizzare anche questo:

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

Per effettuare un'attività di chiamata utilizzando intenti, si dovrebbe richiedere le autorizzazioni appropriate.

Per includere utilizza le autorizzazioni nel file AndroidManifest.xml.

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

Poi includere il seguente codice nella vostra attività

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

Per evitare questo - si può usare l'interfaccia grafica per l'inserimento delle autorizzazioni. Eclipse prendersi cura di dove inserire il tag permesso e più spesso poi non è corretto

In Android per alcune funzionalità è necessario aggiungere l'autorizzazione al file manifesto.

  1. Vai Progetti AndroidManifest.xml
  2. Fare clic sulla scheda Autorizzazioni
  3. Fare clic su Add
  4. Seleziona Utilizza il permesso
  5. Vedere l'istantanea seguente entra descrizione dell'immagine qui

6.Save file manifesto e quindi eseguire il progetto. Il progetto ora dovrebbe funzionare come previsto.

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

^ La risposta sta nel l'uscita eccezione " 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")));
                }

Per chiamata da dialer (Nessun permesso necessario):

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

Per chiamata diretta da app (Permission necessario):

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

Il permesso:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top