Autore Topic: Eseguire una chiamata - dichiarazione Intent Manifest  (Letto 3289 volte)

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Eseguire una chiamata - dichiarazione Intent Manifest
« il: 06 Luglio 2011, 15:45:49 CEST »
0
la mia app di prova contiene una schermata in cui è possibile digitare un numero ed eseguire una chiamata al click di un determinato bottone.
Sto provando l'app sull'AVD e questo è quello che faccio nella mia activity:

Codice (Java): [Seleziona]
 
.....
         dial.setOnClickListener(new OnClickListener() {                       
                        @Override
                        public void onClick(View v) {
                                String toDial = "tel:" + number.getText().toString();
                                Log.i(TAG, toDial);
                                startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(toDial)));
                        }
                });


questo nel manifest:

Codice (Java): [Seleziona]
       
....
        <uses-permission android:name="android.permission.CALL_PHONE" />
        <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
.....

        <activity  android:name=".activity.CsCallActivity">
                        <intent-filter>
                          <action android:name="android.intent.action.CALL"/>
                          <category android:name="android.intent.category.DEFAULT"/>
                         
                        </intent-filter>
                </activity>    


al click però ottengo uno "stopped unexpectedly" e ricevo da logcat un'eccezione del genere:

07-06 15:49:44.236: ERROR/AndroidRuntime(304): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CALL dat=111 }



inoltre credo di non aver capito benissimo gli Intent ad esempio ci sono dei campi obbligatori da dichiarare nel manifest quando si dichiara un intent filter?
Quale è il tag <data> da dichiarare ad esempio per una action CALL se il suo valore sarà determinato a runtime (l'utente inserisce il numero da chiamare)

Ogni suggerimento è ben accetto.
Grazie mille


Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Eseguire una chiamata - dichiarazione Intent Manifest
« Risposta #1 il: 06 Luglio 2011, 16:56:38 CEST »
+2
ACTION_CALL | Android Developers
Dalla doc.ufficiale : Note: there will be restrictions on which applications can initiate a call; most applications should use the ACTION_DIAL.

Gli intent filter servono per specificare a quali intents un activity, un service o un broadcast receiver possono rispondere.
La spiegazione di questa frase, in modo pratico, è data dalla riga di codice : startActivity(new Intent("my.action"));

Si potrebbe ad esempio creare un custom intent per una activity e renderla accessibile anche da altri programmi e/o sviluppatori, eseguendo poi il programma o parte di esso semplicemente lanciando uno startActivity() o uno startActivityForResult()

Un altro esempio pratico è la dichiarazione dell'intent filter per l'activity principale di ogni app :

Codice (XML): [Seleziona]
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Questa dichiarazione serve ad Android per definire la categoria dell'app (in questo caso la nostra app/activity finirà nella lista dei programmi... :-P) e soprattutto per definire quale activity dovrà essere lanciata all'apertura dell'app...è un po' come se il "Launcher" di Android lanciasse uno : startActivity(new Intent("android.intent.action.MAIN")) relativo alla nostra app...che in pratica è un po' quello che fa


Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Eseguire una chiamata - dichiarazione Intent Manifest
« Risposta #2 il: 06 Luglio 2011, 17:13:31 CEST »
0
Innanzitutto Grazie per aver risposto, Teskio.

Proverò se un ACTION_DIAL ti fa comporre il numero (solo) o anche effettuare una chiamata (c'è qualcuno che l'ha mai provato?).
L'intent più chiaro è quello che si usa per "l'entry-point" di una app.

Sapresti dare una risposta alle seguenti due domande?

- Sai se  ci sono dei campi obbligatori da dichiarare nel manifest quando si dichiara un intent filter?
-  Quale è il tag <data> da dichiarare ad esempio per una action CALL se il suo valore sarà determinato a runtime (l'utente inserisce il numero da chiamare)
 
Grazie 1000

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Eseguire una chiamata - dichiarazione Intent Manifest
« Risposta #3 il: 06 Luglio 2011, 18:06:06 CEST »
+1
1) Si. Se si dichiara un intent filter è logico dichiarare un <action>, nonchè obbligatorio :-P
2) il tag <data> serve per dichiarare delle "regole" relative ad un intent filter. Guarda qui : <data> | Android Developers. Ad esempio, quando crei l'intent per ACTION_CALL, definisci anche un elemento data relativo al numero da chiamare, ma tale numero è preceduto da una stringa, cioè -> tel:
Questa "regola" è definita mediante l'attributo android:scheme del tag <data>
Non devi definire <data> per usare Intent.ACTION_CALL di Android, poichè tale attributo è già dichiarato dal framework stesso...Lo userai per i tuoi custom intent ad esempio.

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Eseguire una chiamata - dichiarazione Intent Manifest
« Risposta #4 il: 08 Luglio 2011, 10:25:41 CEST »
0
la chiamata funziona sul mio HTC Legend e posto di seguito il codice che ho utilizzato:

Codice (Java): [Seleziona]
public class CsCallActivity extends Activity {
         protected static final String TAG = "CS CALL .................";

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.cscall);

         final EditText number = (EditText) findViewById(R.id.numberEditTxt);
         
         Button dial = (Button) findViewById(R.id.dialBtn);
         
         dial.setOnClickListener(new OnClickListener() {                       
                        @Override
                        public void onClick(View v) {
                                String toDial = "tel:" + number.getText().toString();
                                Log.i(TAG, toDial);
                                startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(toDial)));
                        }
                });
         }
}

Codice (XML): [Seleziona]
                <activity  android:name=".activity.CsCallActivity">
                        <intent-filter>
                          <action android:name="android.intent.action.CALL"/>
                          <category android:name="android.intent.category.DEFAULT"/>                     
                        </intent-filter>
                </activity>