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

  • Vous recherchez un style TabHost universel qui fonctionnera sur les peintures Android, HTC Sense, Samsung, etc.
  • Quelles sont les différences entre Surfaceview et TextureView?
  • Comment ajouter des éléments de sous-menu à l'action ActionBar dans le code?
  • Défilement / zoom d'une scène dans OpenGL et subdivision
  • Hide softkeyboard for locker app
  • PopupWindow dans Android
  • 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

  • Comment configurer le texte du bouton Image (Android)?
  • Diaporama dans le viewpager Android?
  • Commencer / arrêter le Wi-Fi intégré / USB tethering from code?
  • Les limites de l'API Google Maps s'appliquent-elles aux applications Android?
  • Comment lire une vidéo avec l'API YouTube à l'aide de YouTubePlayerFragment?
  • OnSaveInstanceState / onPause - attendez jusqu'à ce que l'état soit complètement sauvegardé avant que le processus ne soit tué
  • coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.