How to Make Android Apps 22

Android Text Messaging ExampleIn this one video I’ll provide an Android Text Messaging example program. I’ll cover how to send and receive text messages. I’ll also talk about Android Handlers and threads.

I did my best to make everything very simple so you’ll be able to use the code in your programs. All of the code, like always, follows the video below. Do anything you’d like with it.

If you find videos like this useful, it helps if you tell Google Plus with a click here [googleplusone]

Code From the Video

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.newthinktank.derekbanas.texting"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.newthinktank.derekbanas.texting.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SENDTO" />

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

                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.newthinktank.derekbanas.texting.MainActivity$SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.newthinktank.derekbanas.texting.MainActivity$MMSReceiver"
            android:permission="android.permission.BROADCAST_WAP_PUSH" >
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />

                <data android:mimeType="application/vnd.wap.mms-message" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.newthinktank.derekbanas.texting.MainActivity$HeadlessSmsSendService"
            android:exported="true"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" >
            <intent-filter>
                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />

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

                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </service>
    </application>

</manifest>

activity_main.xml

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/pNumEditText"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="164dp"
        android:hint="Phone Number" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send"
        android:id="@+id/sendButton"
        android:layout_alignBottom="@+id/pNumEditText"
        android:layout_toRightOf="@+id/pNumEditText"
        android:layout_toEndOf="@+id/pNumEditText"
        android:layout_marginLeft="10dp"
        android:onClick="sendMessage"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/txtMsgEditText"
        android:layout_below="@+id/sendButton"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:lines="5"
        android:hint="Message"
        android:longClickable="false"
        android:layout_marginTop="10dp">
    <requestFocus />
    </EditText>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/messagesEditText"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/sendButton" />
</RelativeLayout>

MainActivity.java

package com.newthinktank.derekbanas.texting;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    EditText txtMsgEditText, pNumEditText, messagesEditText;
    Button sendButton;

    static String messages = "";

    // Allows use to update the UI with new messages by telling the Activity
    // to update the UI every 5 seconds
    // A handler can schedule for code to execute at a set time in this Activities
    // thread
    Handler mHandler = new Handler();

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

        txtMsgEditText = (EditText) findViewById(R.id.txtMsgEditText);
        pNumEditText = (EditText) findViewById(R.id.pNumEditText);
        messagesEditText = (EditText) findViewById(R.id.messagesEditText);
        sendButton = (Button) findViewById(R.id.sendButton);

        // Thread updates the messages EditText every 10 seconds
        new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (true) {
                    try {

                        // Wait 5 seconds and then execute the code in run()
                        Thread.sleep(5000);
                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {

                                // Update the messagesEditText
                                messagesEditText.setText(messages);
                            }
                        });
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }).start();

    }

    public void sendMessage(View view) {

        // Get the phone number and message to send
        String phoneNum = pNumEditText.getText().toString();
        String message = txtMsgEditText.getText().toString();

        try{

            // Handles sending and receiving data and text
            SmsManager smsManager = SmsManager.getDefault();

            // Sends the text message
            // 2nd is for the service center address or null
            // 4th if not null broadcasts with a successful send
            // 5th if not null broadcasts with a successful delivery
            smsManager.sendTextMessage(phoneNum, null, message, null, null);

            Toast.makeText(this, "Message Sent", Toast.LENGTH_SHORT).show();

        }
        catch (IllegalArgumentException ex){

            Log.e("TEXTING", "Destination Address or Data Empty");
            Toast.makeText(this, "Enter a Phone Number and Message", Toast.LENGTH_LONG).show();
            ex.printStackTrace();

        }
        catch (Exception ex) {
            Toast.makeText(this, "Message Not Sent", Toast.LENGTH_LONG).show();
            ex.printStackTrace();
        }

        // Update the message EditText
        messages = messages + "You : " + message + "\n";

    }

    // Receives texts
    public static class SmsReceiver extends BroadcastReceiver{

        // Handles sending and receiving data and text
        final SmsManager smsManager = SmsManager.getDefault();

        public SmsReceiver() {
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            final Bundle bundle = intent.getExtras();

            try{

                // Check if we received data
                if (bundle != null){

                    // Store data sent as a PDU (Protocal Data Unit) which includes the
                    // number and text
                    final Object[] pdusObj = (Object[]) bundle.get("pdus");

                    // Cycle through the data received
                    for (int i = 0; i < pdusObj.length; i++) {

                        // Create a SmsMessage from the raw PDU data
                        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);

                        // Get sending phone number
                        String phoneNumber = smsMessage.getDisplayOriginatingAddress();

                        // Get the message sent
                        String message = smsMessage.getDisplayMessageBody();

                        // Update the messages EditText
                        // messages = messages + phoneNumber + " : " + message + "\n";

                        // I use this to block the receiving number
                        messages = messages + "Sender : " + message + "\n";

                    } // end for loop
                } // bundle is null

            } catch (Exception ex) {
                Log.e("SmsReceiver", "Exception smsReceiver" +ex);

            }

            }

    }

    // Handles receiving MMS
    public class MMSReceiver extends BroadcastReceiver {
        public MMSReceiver() {
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            throw new UnsupportedOperationException("Not Implemented Yet");

        }

    }

    // Handles when you want to send a pre-written message when a call is rejected
    public class HeadlessSmsSendService extends BroadcastReceiver {
        public HeadlessSmsSendService() {
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            throw new UnsupportedOperationException("Not Implemented Yet");

        }

    }
    
    @Override
    protected void onDestroy() {
        mHandler.removeCallbacksAndMessages(null);
        super.onDestroy();
    }

}

2 thoughts on “How to Make Android Apps 22”

  1. Dude im pretty confused i android studio doesnt work in my pc can i use eclipse and copy what u do in android studio? What happens then? Everyone teaches and uses android studio and i use eclipse will it be the same?

Leave a Reply

Your email address will not be published. Required fields are marked *