Pergunta

É o mesmo problema que em Discador personalizado do Android ao tocar em links de números de telefone.Eu fiz tudo conforme indicado lá.

Quero que meu aplicativo apareça no seletor de aplicativos quando um número de telefone for tocado.

Eu tenho

package com.example.editcall;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class OutgoingCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        Log.d(OutgoingCallReceiver.class.getSimpleName(), intent.toString() + ", call to: " + phoneNumber);
        Toast.makeText(context, "Outgoing call catched: " + phoneNumber, Toast.LENGTH_LONG).show(); 
    }

}

E em AndroidManifest.xml:

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

    <receiver
        android:name=".OutgoingCallReceiver"
        android:exported="true" >
        <intent-filter android:priority="100" >
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.DIAL" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="tel" />
        </intent-filter>
    </receiver>

Mas não aparece no seletor de aplicativos.Qualquer ideia?

Solução:

Como @CommonsWare mencionou abaixo, precisa ser uma atividade.

Além disso, android.intent.category.LAUNCHER não funciona, deve ser android.intent.category.DEFAULT.

E você pode esquecer (por isso :-) sobre android:priority e android:exported.

Então, isso funciona:

    <activity android:name=".ui.SearchActivity" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.DIAL" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="tel" />
        </intent-filter>
    </activity>

com isso para obter o número de telefone:

public class SearchActivity extends FragmentActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String calledNumber = null;
        String inputURI = this.getIntent().getDataString();
        if (inputURI != null) {
            Uri uri = Uri.parse(Uri.decode(inputURI));
            if (uri.getScheme().equals("tel")) {
                calledNumber = uri.getSchemeSpecificPart();
            }
        }    
    }
Foi útil?

Solução

Seu <intent-filter> é projetado para um <activity>.Você não terá sorte em usá-lo com um <receiver>.Além disso, o seletor mostra apenas atividades.Portanto, crie um <activity>, e use seu <intent-filter> lá (talvez menos o priority).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top