Come fare una telefonata utilizzando intenti Android?
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)
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.
- Vai Progetti AndroidManifest.xml
- Fare clic sulla scheda Autorizzazioni
- Fare clic su Add
- Seleziona Utilizza il permesso
- Vedere l'istantanea seguente
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>