Comment implémenter une boîte de dialogue comme truecaller dans Android

J'essaie d'implémenter l'application similaire à l'appelant réel, je peux obtenir le numéro de téléphone lorsque le téléphone sonne à l'aide du récepteur de diffusion et l'ouverture de l'activité MyCustomDialog

C'est la classe de mon récepteur par laquelle je reçois l'état d'appel que l'appel commence ou se termine. Dans ce cas, je fais quelques méthodes que j'utilise dans CallReceiver.java

  • Android: comment vérifier si une activité est en cours?
  • Comment ajouter une activité de paramètres de notification aux paramètres du système
  • L'icône de l'application cliquant sur ne déclenche pas onOptionsItemSelected ()
  • Affichage de la liste d'Android à l'intérieur d'une vue de défilement
  • Android mise à l'échelle / transformation de la toile ne modifie pas la zone cliquable
  • Exemple de pushnotification Android "hello world"
  • PhonecallReceiver.java

    import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import java.util.Date; public abstract class PhonecallReceiver extends BroadcastReceiver { private static int lastState = TelephonyManager.CALL_STATE_IDLE; private static Date callStartTime; private static boolean isIncoming; private static String savedNumber; @Override public void onReceive(Context context, Intent intent) { try { if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); } else { String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); int state = 0; if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) { state = TelephonyManager.CALL_STATE_IDLE; } else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { state = TelephonyManager.CALL_STATE_OFFHOOK; } else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)) { state = TelephonyManager.CALL_STATE_RINGING; } onCallStateChanged(context, state, number); } } catch (Exception e) { e.printStackTrace(); } } //Derived classes should override these to respond to specific events of interest protected void onIncomingCallStarted(Context ctx, String number, Date start){} protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end){} public void onCallStateChanged(Context context, int state, String number) { if(lastState == state) { //No change, debounce extras return; } switch (state) { case TelephonyManager.CALL_STATE_RINGING: isIncoming = true; callStartTime = new Date(); savedNumber = number; onIncomingCallStarted(context, number, callStartTime); break; case TelephonyManager.CALL_STATE_OFFHOOK: if (isIncoming) { onIncomingCallEnded(context,savedNumber,callStartTime,new Date()); } case TelephonyManager.CALL_STATE_IDLE: if(isIncoming) { onIncomingCallEnded(context, savedNumber, callStartTime, new Date()); } } lastState = state; } } 

    CallReceiver.java

     import android.app.Activity; import android.app.Dialog; import android.app.Notification; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.Toast; import android.os.Handler; import java.util.Date; import dootam.dspl.com.lawyercasecall.R; public class CallReceiver extends PhonecallReceiver { Context context; @Override protected void onIncomingCallStarted(final Context ctx, String number, Date start) { Toast.makeText(ctx,"Kushal Incoming Call"+ number,Toast.LENGTH_LONG).show(); context = ctx; final Intent intent = new Intent(context, MyCustomDialog.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra("phone_no",number); new Handler().postDelayed(new Runnable() { @Override public void run() { context.startActivity(intent); } },2000); // MyCus/*tomDialog dialog = new MyCustomDialog(context); // dialog.*/show(); } @Override protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end) { Toast.makeText(ctx,"Bye Bye"+ number,Toast.LENGTH_LONG).show(); } } 

    MyCustomDialog.java

     import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.TextView; import dootam.dspl.com.lawyercasecall.R; public class MyCustomDialog extends Activity { TextView tv_client; String phone_no; Button dialog_ok; @Override protected void onCreate(Bundle savedInstanceState) { try { requestWindowFeature(Window.FEATURE_NO_TITLE); this.setFinishOnTouchOutside(false); super.onCreate(savedInstanceState); setContentView(R.layout.dialog); initializeContent(); /*WindowManager.LayoutParams params = getWindow().getAttributes(); params.x = -100; params.height = 70; params.width = 1000; params.y = -50; this.getWindow().setAttributes(params);*/ phone_no = getIntent().getExtras().getString("phone_no"); tv_client.setText(""+phone_no +" is calling you"); dialog_ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyCustomDialog.this.finish(); // this.setFinishOnTouchOutside(false); System.exit(0); } }); } catch (Exception e) { Log.d("Exception", e.toString()); e.printStackTrace(); } } private void initializeContent() { tv_client = (TextView) findViewById(R.id.tv_client); dialog_ok = (Button) findViewById(R.id.dialog_ok); } } 

    Mon AndroidManifest.xml

      <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".AddCasesActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".receiver.MyCustomDialog" android:theme="@android:style/Theme.Dialog" android:noHistory="true" /> <receiver android:name=".receiver.CallReceiver" > <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" tools:ignore="ProtectedPermissions"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

    En mettant en œuvre toutes ces choses, je reçois le résultat souhaité

    La sortie de mon récepteur à l'appel entrant

    Veuillez me guider sur la façon de rendre cette boîte de dialogue d'activité entraînable comme la popup de l'application Truecaller.

    Je recherche le dialogue similaire à cette image,

    Truecaller écran entrant

  • Quel est le rôle de content_main.xml dans Android Studio 1.4?
  • Ensemble @OnClick avec identifiants optionnels (ButterKnife)
  • L'émulateur Android est tellement lent qu'il est inutilisable
  • Notification setAutoCancel (true) ne fonctionne pas
  • Android Obtenez l'horodatage actuel?
  • Comment supprimer le numéro de barre de progression dans la partie inférieure de la barre de progression?
  • coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.