La aplicación de contactos en el dispositivo Android es una aplicación de sistema que viene instalada en su dispositivo Android. Los diferentes dispositivos tienen una interfaz de usuario diferente para la aplicación de contactos. En este artículo, veremos cómo podemos crear nuestra propia aplicación de contactos en Android Studio .
¿Qué vamos a construir en este artículo?
Construiremos una aplicación simple en la que mostraremos la lista de contactos que están almacenados en el dispositivo del usuario. Junto con eso, también agregaremos una función para guardar un nuevo contacto, filtrar contactos de la lista usando la barra de búsqueda y mucho más. A continuación se muestra el video en el que veremos lo que vamos a construir en este artículo.
Implementación paso a paso
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2: agregue la dependencia y el repositorio de JitPack
Como tendremos que solicitar los permisos del usuario para mostrar los contactos del dispositivo en la aplicación, debemos solicitar los permisos del usuario. Entonces, para obtener los permisos de los usuarios, usaremos Dexter para obtener los permisos de los usuarios en tiempo de ejecución. Para usar Dexter y también usaremos la dependencia de texto dibujable para mostrar texto dentro de dibujable, ahora hemos agregado la dependencia a continuación en el archivo build.gradle . Navegue a Gradle Scripts > build.gradle(Module:app) y agregue la siguiente dependencia en la sección de dependencias.
implementación ‘com.github.mukeshsolanki:photofilter:1.0.2’
implementación ‘com.karumi:dexter:6.2.2’
Agregue el repositorio de JitPack a su archivo de compilación. Agréguelo a su root build.gradle al final de los repositorios dentro de la sección allprojects{ }.
todos los proyectos {
repositorios {
…
experto {url «https://jitpack.io»}
}
}
Ahora sincronice su proyecto y seguiremos trabajando con el archivo AndroidManifest.xml.
Paso 3: Agregar permisos en AndroidManifest.xml
Vaya a la aplicación > archivo AndroidManifest.xml y agréguele los siguientes permisos. Se agregan comentarios en el código para conocer con más detalle.
XML
<!--permissions to read contacts--> <uses-permission android:name="android.permission.READ_CONTACTS" /> <!--permissions to write contacts--> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!--permissions to make a call--> <uses-permission android:name="android.permission.CALL_PHONE"/> <!--permissions to send sms--> <uses-permission android:name="android.permission.SEND_SMS" /> <!--permissions to write sms--> <uses-permission android:name="android.permission.WRITE_SMS"/>
Después de agregar permisos ahora, avanzaremos hacia la creación de una nueva actividad para diferentes pantallas en nuestra aplicación.
Paso 4: Crear nuevas actividades vacías
Crear una nueva actividad para guardar un nuevo contacto:
Consulte Cómo crear una nueva actividad en Android Studio y nombre su actividad como CreateNewContactActivity. Esta actividad se utilizará para crear un nuevo contacto para nuestra aplicación.
Creación de una nueva actividad para mostrar los datos de contacto:
Del mismo modo, cree otra actividad vacía y nombre su actividad como ContactDetailActivity . Esta actividad se utilizará para realizar una llamada a ese contacto o para enviar un SMS.
Paso 5: trabajar con el archivo activity_main.xml
Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <!--Recycler view for displaying list of contacts--> <androidx.recyclerview.widget.RecyclerView android:id="@+id/idRVContacts" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--progress bar for displaying loading--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <!--fab for adding a new contact--> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/idFABadd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_margin="20dp" android:src="@drawable/ic_account" app:fabCustomSize="40dp" app:tint="@color/white" /> </RelativeLayout>
Paso 6: crear una clase modal para almacenar contactos
Vaya a la aplicación > java > nombre del paquete de la aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre ContactsModal y agréguele el código siguiente. Se agregan comentarios en el código para conocer con más detalle.
Java
public class ContactsModal { // variables for our user name // and contact number. private String userName; private String contactNumber; // constructor public ContactsModal(String userName, String contactNumber) { this.userName = userName; this.contactNumber = contactNumber; } // on below line we have // created getter and setter public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getContactNumber() { return contactNumber; } public void setContactNumber(String contactNumber) { this.contactNumber = contactNumber; } }
Paso 7: crear un archivo de diseño para que el elemento se muestre en RecyclerView
Navegue a la aplicación> res> diseño> Haga clic con el botón derecho en él> Nuevo> Archivo de recursos de diseño y nómbrelo como contactos_rv_elemento y agregue el código a continuación. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/idRLContact" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="3dp"> <!--image view for displaying the first letter of contact--> <ImageView android:id="@+id/idIVContact" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="8dp" android:padding="3dp" android:src="@mipmap/ic_launcher" /> <!--text view for displaying user name--> <TextView android:id="@+id/idTVContactName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="8dp" android:layout_marginTop="12dp" android:layout_marginEnd="8dp" android:layout_toRightOf="@id/idIVContact" android:text="Contact Name" android:textColor="@color/black" /> </RelativeLayout>
Paso 8: crear una clase de adaptador para configurar datos para cada elemento
Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre ContactsRVAdapter y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; import java.util.ArrayList; class ContactRVAdapter extends RecyclerView.Adapter<ContactRVAdapter.ViewHolder> { // creating variables for context and array list. private Context context; private ArrayList<ContactsModal> contactsModalArrayList; // creating a constructor public ContactRVAdapter(Context context, ArrayList<ContactsModal> contactsModalArrayList) { this.context = context; this.contactsModalArrayList = contactsModalArrayList; } @NonNull @Override public ContactRVAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // passing our layout file for displaying our card item return new ContactRVAdapter.ViewHolder(LayoutInflater.from(context).inflate(R.layout.contacts_rv_item, parent, false)); } // below method is use for filtering data in our array list public void filterList(ArrayList<ContactsModal> filterllist) { // on below line we are passing filtered // array list in our original array list contactsModalArrayList = filterllist; notifyDataSetChanged(); } @Override public void onBindViewHolder(@NonNull ContactRVAdapter.ViewHolder holder, int position) { // getting data from array list in our modal. ContactsModal modal = contactsModalArrayList.get(position); // on below line we are setting data to our text view. holder.contactTV.setText(modal.getUserName()); ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT // generate random color int color = generator.getRandomColor(); // below text drawable is a circular. TextDrawable drawable2 = TextDrawable.builder().beginConfig() .width(100) // width in px .height(100) // height in px .endConfig() // as we are building a circular drawable // we are calling a build round method. // in that method we are passing our text and color. .buildRound(modal.getUserName().substring(0, 1), color); // setting image to our image view on below line. holder.contactIV.setImageDrawable(drawable2); // on below line we are adding on click listener to our item of recycler view. holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line we are opening a new activity and passing data to it. Intent i = new Intent(context, ContactDetailActivity.class); i.putExtra("name", modal.getUserName()); i.putExtra("contact", modal.getContactNumber()); // on below line we are starting a new activity, context.startActivity(i); } }); } @Override public int getItemCount() { return contactsModalArrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { // on below line creating a variable // for our image view and text view. private ImageView contactIV; private TextView contactTV; public ViewHolder(@NonNull View itemView) { super(itemView); // initializing our image view and text view. contactIV = itemView.findViewById(R.id.idIVContact); contactTV = itemView.findViewById(R.id.idTVContactName); } } }
Paso 9: crear un nuevo archivo de recursos de menú para agregar una vista de búsqueda en la barra de herramientas
Navegue a la aplicación> res> Haga clic con el botón derecho en él> Nuevo> Directorio de recursos de Android y asígnele el nombre menú después de eso, haga clic con el botón derecho en el menú y haga clic en Nuevo> Directorio de recursos de menú . Después de ese nombre, archiva como search_menu y agrega el siguiente código. Se agregan comentarios en el código para conocer con más detalle. o puede consultar este artículo ¿Cómo crear una carpeta de menú y un archivo de menú en Android Studio?
XML
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!--creating an item for our search view--> <item android:id="@+id/app_bar_search" android:icon="@drawable/ic_account" android:title="Search" app:actionViewClass="android.widget.SearchView" app:showAsAction="ifRoom|withText" /> </menu>
Paso 10: trabajar con el archivo MainActivity.java
MainActivity.java MainActivity.java
Java
import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.Settings; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.SearchView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.karumi.dexter.Dexter; import com.karumi.dexter.MultiplePermissionsReport; import com.karumi.dexter.PermissionToken; import com.karumi.dexter.listener.DexterError; import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.PermissionRequestErrorListener; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { // creating variables for our array list, recycler view progress bar and adapter. private ArrayList<ContactsModal> contactsModalArrayList; private RecyclerView contactRV; private ContactRVAdapter contactRVAdapter; private ProgressBar loadingPB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // on below line we are initializing our variables. contactsModalArrayList = new ArrayList<>(); contactRV = findViewById(R.id.idRVContacts); FloatingActionButton addNewContactFAB = findViewById(R.id.idFABadd); loadingPB = findViewById(R.id.idPBLoading); // calling method to prepare our recycler view. prepareContactRV(); // calling a method to request permissions. requestPermissions(); // adding on click listener for our fab. addNewContactFAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // opening a new activity on below line. Intent i = new Intent(MainActivity.this, CreateNewContactActivity.class); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // in this on create options menu we are calling // a menu inflater and inflating our menu file. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.search_menu, menu); // on below line we are getting our menu item as search view item MenuItem searchViewItem = menu.findItem(R.id.app_bar_search); // on below line we are creating a variable for our search view. final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchViewItem); // on below line we are setting on query text listener for our search view. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // on query submit we are clearing the focus for our search view. searchView.clearFocus(); return false; } @Override public boolean onQueryTextChange(String newText) { // on changing the text in our search view we are calling // a filter method to filter our array list. filter(newText.toLowerCase()); return false; } }); return super.onCreateOptionsMenu(menu); } private void filter(String text) { // in this method we are filtering our array list. // on below line we are creating a new filtered array list. ArrayList<ContactsModal> filteredlist = new ArrayList<>(); // on below line we are running a loop for checking if the item is present in array list. for (ContactsModal item : contactsModalArrayList) { if (item.getUserName().toLowerCase().contains(text.toLowerCase())) { // on below line we are adding item to our filtered array list. filteredlist.add(item); } } // on below line we are checking if the filtered list is empty or not. if (filteredlist.isEmpty()) { Toast.makeText(this, "No Contact Found", Toast.LENGTH_SHORT).show(); } else { // passing this filtered list to our adapter with filter list method. contactRVAdapter.filterList(filteredlist); } } private void prepareContactRV() { // in this method we are preparing our recycler view with adapter. contactRVAdapter = new ContactRVAdapter(this, contactsModalArrayList); // on below line we are setting layout manager. contactRV.setLayoutManager(new LinearLayoutManager(this)); // on below line we are setting adapter to our recycler view. contactRV.setAdapter(contactRVAdapter); } private void requestPermissions() { // below line is use to request // permission in the current activity. Dexter.withActivity(this) // below line is use to request the number of // permissions which are required in our app. .withPermissions(Manifest.permission.READ_CONTACTS, // below is the list of permissions Manifest.permission.CALL_PHONE, Manifest.permission.SEND_SMS, Manifest.permission.WRITE_CONTACTS) // after adding permissions we are // calling an with listener method. .withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) { // this method is called when all permissions are granted if (multiplePermissionsReport.areAllPermissionsGranted()) { // do you work now getContacts(); Toast.makeText(MainActivity.this, "All the permissions are granted..", Toast.LENGTH_SHORT).show(); } // check for permanent denial of any permission if (multiplePermissionsReport.isAnyPermissionPermanentlyDenied()) { // permission is denied permanently, // we will show user a dialog message. showSettingsDialog(); } } @Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) { // this method is called when user grants some // permission and denies some of them. permissionToken.continuePermissionRequest(); } }).withErrorListener(new PermissionRequestErrorListener() { // this method is use to handle error // in runtime permissions @Override public void onError(DexterError error) { // we are displaying a toast message for error message. Toast.makeText(getApplicationContext(), "Error occurred! ", Toast.LENGTH_SHORT).show(); } }) // below line is use to run the permissions // on same thread and to check the permissions .onSameThread().check(); } // below is the shoe setting dialog // method which is use to display a // dialogue message. private void showSettingsDialog() { // we are displaying an alert dialog for permissions AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // below line is the title // for our alert dialog. builder.setTitle("Need Permissions"); // below line is our message for our dialog builder.setMessage("This app needs permission to use this feature. You can grant them in app settings."); builder.setPositiveButton("GOTO SETTINGS", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // this method is called on click on positive // button and on clicking shit button we // are redirecting our user from our app to the // settings page of our app. dialog.cancel(); // below is the intent from which we // are redirecting our user. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 101); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // this method is called when // user click on negative button. dialog.cancel(); } }); // below line is used // to display our dialog builder.show(); } private void getContacts() { // this method is use to read contact from users device. // on below line we are creating a string variables for // our contact id and display name. String contactId = ""; String displayName = ""; // on below line we are calling our content resolver for getting contacts Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); // on blow line we are checking the count for our cursor. if (cursor.getCount() > 0) { // if the count is greater than 0 then we are running a loop to move our cursor to next. while (cursor.moveToNext()) { // on below line we are getting the phone number. int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); if (hasPhoneNumber > 0) { // we are checking if the has phone number is > 0 // on below line we are getting our contact id and user name for that contact contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // on below line we are calling a content resolver and making a query Cursor phoneCursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{contactId}, null); // on below line we are moving our cursor to next position. if (phoneCursor.moveToNext()) { // on below line we are getting the phone number for our users and then adding the name along with phone number in array list. String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); contactsModalArrayList.add(new ContactsModal(displayName, phoneNumber)); } // on below line we are closing our phone cursor. phoneCursor.close(); } } } // on below line we are closing our cursor. cursor.close(); // on below line we are hiding our progress bar and notifying our adapter class. loadingPB.setVisibility(View.GONE); contactRVAdapter.notifyDataSetChanged(); } }
Paso 11: Trabajar con CreateNewContactActivity
A continuación se muestra el código para el archivo activity_create_new_contact.xml y CreateNewContactActivity.java .
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".CreateNewContactActivity"> <!--edit text for user name--> <EditText android:id="@+id/idEdtName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:hint="Enter Name" android:inputType="text" /> <!--edit text for user phone number--> <EditText android:id="@+id/idEdtPhoneNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:hint="Enter Number" android:inputType="phone" /> <!--edit text for user email--> <EditText android:id="@+id/idEdtEmail" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:hint="Enter Email Address" android:inputType="text" /> <!--button for saving a new contact--> <Button android:id="@+id/idBtnAddContact" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="Save Contact" android:textAllCaps="false" /> </LinearLayout>
Java
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.provider.ContactsContract; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; public class CreateNewContactActivity extends AppCompatActivity { // creating a new variable for our edit text and button. private EditText nameEdt, phoneEdt, emailEdt; private Button addContactEdt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_new_contact); // on below line we are initializing our variables. nameEdt = findViewById(R.id.idEdtName); phoneEdt = findViewById(R.id.idEdtPhoneNumber); emailEdt = findViewById(R.id.idEdtEmail); addContactEdt = findViewById(R.id.idBtnAddContact); // on below line we are adding on click listener for our button. addContactEdt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line we are getting text from our edit text. String name = nameEdt.getText().toString(); String phone = phoneEdt.getText().toString(); String email = emailEdt.getText().toString(); // on below line we are making a text validation. if (TextUtils.isEmpty(name) && TextUtils.isEmpty(email) && TextUtils.isEmpty(phone)) { Toast.makeText(CreateNewContactActivity.this, "Please enter the data in all fields. ", Toast.LENGTH_SHORT).show(); } else { // calling a method to add contact. addContact(name, email, phone); } } }); } private void addContact(String name, String email, String phone) { // in this method we are calling an intent and passing data to that // intent for adding a new contact. Intent contactIntent = new Intent(ContactsContract.Intents.Insert.ACTION); contactIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE); contactIntent .putExtra(ContactsContract.Intents.Insert.NAME, name) .putExtra(ContactsContract.Intents.Insert.PHONE, phone) .putExtra(ContactsContract.Intents.Insert.EMAIL, email); startActivityForResult(contactIntent, 1); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // in on activity result method. if (requestCode == 1) { // we are checking if the request code is 1 if (resultCode == Activity.RESULT_OK) { // if the result is ok we are displaying a toast message. Toast.makeText(this, "Contact has been added.", Toast.LENGTH_SHORT).show(); Intent i = new Intent(CreateNewContactActivity.this, MainActivity.class); startActivity(i); } // else we are displaying a message as contact addition has cancelled. if (resultCode == Activity.RESULT_CANCELED) { Toast.makeText(this, "Cancelled Added Contact", Toast.LENGTH_SHORT).show(); } } } }
Paso 12: trabajar con ContactDetailActivity
A continuación se muestra el código para el archivo activity_contact_detail.xml y ContactDetailActivity.java .
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ContactDetailActivity"> <!--image view for contact--> <ImageView android:id="@+id/idIVContact" android:layout_width="match_parent" android:layout_height="300dp" android:background="@color/purple_200" android:padding="50dp" android:src="@drawable/ic_account" app:tint="@color/white" /> <!--text view for displaying user name--> <TextView android:id="@+id/idTVName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idIVContact" android:background="@color/purple_200" android:padding="8dp" android:text="Name" android:textColor="@color/white" android:textSize="18sp" /> <!--cardview for displaying user contact--> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTVName" android:layout_marginStart="4dp" android:layout_marginTop="20dp" android:layout_marginEnd="4dp" app:cardCornerRadius="4dp" app:cardElevation="4dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <!--image view for making a call --> <ImageView android:id="@+id/idIVCall" android:layout_width="40dp" android:layout_height="40dp" android:layout_margin="8dp" android:padding="4dp" android:src="@drawable/ic_account" app:tint="@color/purple_700" /> <!--text view for displaying user contact--> <TextView android:id="@+id/idTVPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="3dp" android:layout_marginTop="8dp" android:layout_toStartOf="@id/idIVMessage" android:layout_toEndOf="@id/idIVCall" android:layout_toRightOf="@id/idIVCall" android:text="Phone" /> <!--image view for displaying message icon--> <ImageView android:id="@+id/idIVMessage" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentEnd="true" android:layout_margin="8dp" android:padding="4dp" android:src="@drawable/ic_account" app:tint="@color/purple_700" /> </RelativeLayout> </androidx.cardview.widget.CardView> </RelativeLayout>
Java
import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; public class ContactDetailActivity extends AppCompatActivity { // creating variables for our image view and text view and string. . private String contactName, contactNumber; private TextView contactTV, nameTV; private ImageView contactIV, callIV, messageIV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact_detail); // on below line we are getting data which // we passed in our adapter class with intent. contactName = getIntent().getStringExtra("name"); contactNumber = getIntent().getStringExtra("contact"); // initializing our views. nameTV = findViewById(R.id.idTVName); contactIV = findViewById(R.id.idIVContact); contactTV = findViewById(R.id.idTVPhone); nameTV.setText(contactName); contactTV.setText(contactNumber); callIV = findViewById(R.id.idIVCall); messageIV = findViewById(R.id.idIVMessage); // on below line adding click listener for our calling image view. callIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // calling a method to make a call. makeCall(contactNumber); } }); // on below line adding on click listener for our message image view. messageIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // calling a method to send message sendMessage(contactNumber); } }); } private void sendMessage(String contactNumber) { // in this method we are calling an intent to send sms. // on below line we are passing our contact number. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + contactNumber)); intent.putExtra("sms_body", "Enter your messaage"); startActivity(intent); } private void makeCall(String contactNumber) { // this method is called for making a call. // on below line we are calling an intent to make a call. Intent callIntent = new Intent(Intent.ACTION_CALL); // on below line we are setting data to it. callIntent.setData(Uri.parse("tel:" + contactNumber)); // on below line we are checking if the calling permissions are granted not. if (ActivityCompat.checkSelfPermission(ContactDetailActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { return; } // at last we are starting activity. startActivity(callIntent); } }
Ahora ejecute su aplicación y vea el resultado de la aplicación.
Nota : para todos los archivos dibujables, puede consultar el enlace de GitHub o puede agregarlo usted mismo.
Producción:
Consulte el proyecto en el siguiente enlace de Github: https://github.com/ChaitanyaMunje/GFG-Back4App/tree/ContactsApp
Publicación traducida automáticamente
Artículo escrito por chaitanyamunje y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA