Get inbox messages from android device to show in custom listview [duplicate]
Asked Answered
M

2

6

Possible Duplicate:
How can I read SMS messages from the inbox programmatically in Android?

I don't know how can i access the inbox of an android phone programmatically, can you please guide me or share some tutorial how can i do it(Access the inbox of the phone). by the way my application goes like this. it is an SMS Encrypter and my app replicates what the original inbox have and by that i can encrypt messages in send it and vice versa my app is the only way to decrypt that said message.

Maxa answered 31/12, 2012 at 4:39 Comment(2)
I Googled for how can i access the inbox of an android phone programmatically and the 4th link that came up, another SO post, seems an exact duplicate.Inexpert
Yes i know, but those QAs dont address my problem. So, i started a new QAMaxa
K
13

With the help of content Provider you can achieve your goal, look out below Example which is copied from here so that if the blog disappears this post will remain useful, hope it will help you and also go though content provider.

AndroidManifest.xml

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

    <uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="16" />

    <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.itcuties.android.apps.MainActivity"
           android:label="@string/app_name" >
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
    </application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#000">

    <TextView
       android:id="@+id/smsNumberText"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="NUMBER_GOES_HERE">
    </TextView>

</LinearLayout>

SMSData.java

package com.itcuties.android.apps.data;

/**
* This class represents SMS.
*
* @author itcuties
*
*/
public class SMSData {

   // Number from witch the sms was send
   private String number;
   // SMS text body
   private String body;

   public String setNumber() {
       return number;
   }

   public void setNumber(String number) {
       this.number = number;
   }

   public String setBody() {
       return body;
   }

   public void setBody(String body) {
       this.body = body;
   }

}

ListAdapter.java

package com.itcuties.android.apps;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.itcuties.android.apps.data.SMSData;


/**
* List adapter for storing SMS data
*
* @author itcuties
*
*/
public class ListAdapter extends ArrayAdapter<SMSData> {

   // List context
    private final Context context;
    // List values
    private final List<SMSData> smsList;

   public ListAdapter(Context context, List<SMSData> smsList) {
       super(context, R.layout.activity_main, smsList);
       this.context = context;
       this.smsList = smsList;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.activity_main, parent, false);

       TextView senderNumber = (TextView) rowView.findViewById(R.id.smsNumberText);
       senderNumber.setText(smsList.get(position).setNumber().toString());

       return rowView;
   }

}

MainActivity.java

package com.itcuties.android.apps;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.itcuties.android.apps.data.SMSData;

/**
* Main Activity. Displays a list of numbers.
*
* @author itcuties
*
*/
public class MainActivity extends ListActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

 ArrayList<Message> smsInbox = new ArrayList<Message>();

Uri uriSms = Uri.parse("content://sms");

Cursor cursor = this.getContentResolver()
        .query(uriSms,
                new String[] { "_id", "address", "date", "body",
                        "type", "read" }, "type=" + type, null,
                "date" + " COLLATE LOCALIZED ASC");
if (cursor != null) {
    cursor.moveToLast();
    if (cursor.getCount() > 0) {

        do {

            Message message = new Message();
            message.messageNumber = cursor.getString(cursor
                    .getColumnIndex("address"));
            message.messageContent = cursor.getString(cursor
                    .getColumnIndex("body"));
            smsInbox.add(message);
        } while (cursor.moveToPrevious());
    }

       }
       c.close();

       // Set smsList in the ListAdapter
       setListAdapter(new ListAdapter(this, smsList));

   }

   @Override
   protected void onListItemClick(ListView l, View v, int position, long id) {
       SMSData sms = (SMSData)getListAdapter().getItem(position);

       Toast.makeText(getApplicationContext(), sms.setBody(), Toast.LENGTH_LONG).show();

   }

}

also check below links related@

Android Reading Inbox Message

SMS Messaging

inbox_message_listview

Kreegar answered 31/12, 2012 at 4:52 Comment(6)
But, what if the number of inbox messages is really long..........say there are hundred messages in the device, then this code will simply give ANR message.......The inbox messages should be fetched in a different thread.Maxa
@Angela : use AsykTask or Thread for messages in different ThreadWaterman
yes, according to this tutorial prativas.wordpress.com/category/android/… i have used thread for fetching the inbox message.Maxa
@Angela added one more link, if number there are hundred of messages then use array list, fill it using AsynTask as mention by ` ρяσѕρєя K` and then set on list view.Kreegar
@RobinHood, i have done that and posted my ansMaxa
how to group messages according to the phone number and then on the listitem click the particular chat threads open?Entropy
M
1
    public class MainActivity extends Activity {
private static final int TYPE_INCOMING_MESSAGE = 1;
private ListView messageList;
private MessageListAdapter messageListAdapter;
private ArrayList<Message> recordsStored;
private ArrayList<Message> listInboxMessages;
private ProgressDialog progressDialogInbox;
private CustomHandler customHandler;

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

}

@Override
public void onResume() {
    super.onResume();
    populateMessageList();
}

private void initViews() {
    customHandler = new CustomHandler(this);
    progressDialogInbox = new ProgressDialog(this);

    recordsStored = new ArrayList<Message>();

    messageList = (ListView) findViewById(R.id.messageList);
    populateMessageList();
}

public void populateMessageList() {
    fetchInboxMessages();

    messageListAdapter = new MessageListAdapter(this,
            R.layout.message_list_item, recordsStored);
    messageList.setAdapter(messageListAdapter);
}

private void showProgressDialog(String message) {
    progressDialogInbox.setMessage(message);
    progressDialogInbox.setIndeterminate(true);
    progressDialogInbox.setCancelable(true);
    progressDialogInbox.show();
}

private void fetchInboxMessages() {
    if (listInboxMessages == null) {
        showProgressDialog("Fetching Inbox Messages...");
        startThread();
    } else {
        // messageType = TYPE_INCOMING_MESSAGE;
        recordsStored = listInboxMessages;
        messageListAdapter.setArrayList(recordsStored);
    }
}

public class FetchMessageThread extends Thread {

    public int tag = -1;

    public FetchMessageThread(int tag) {
        this.tag = tag;
    }

    @Override
    public void run() {

        recordsStored = fetchInboxSms(TYPE_INCOMING_MESSAGE);
        listInboxMessages = recordsStored;
        customHandler.sendEmptyMessage(0);

    }

}

public ArrayList<Message> fetchInboxSms(int type) {
    ArrayList<Message> smsInbox = new ArrayList<Message>();

    Uri uriSms = Uri.parse("content://sms");

    Cursor cursor = this.getContentResolver()
            .query(uriSms,
                    new String[] { "_id", "address", "date", "body",
                            "type", "read" }, "type=" + type, null,
                    "date" + " COLLATE LOCALIZED ASC");
    if (cursor != null) {
        cursor.moveToLast();
        if (cursor.getCount() > 0) {

            do {

                Message message = new Message();
                message.messageNumber = cursor.getString(cursor
                        .getColumnIndex("address"));
                message.messageContent = cursor.getString(cursor
                        .getColumnIndex("body"));
                smsInbox.add(message);
            } while (cursor.moveToPrevious());
        }
    }

    return smsInbox;

}

private FetchMessageThread fetchMessageThread;

private int currentCount = 0;

public synchronized void startThread() {

    if (fetchMessageThread == null) {
        fetchMessageThread = new FetchMessageThread(currentCount);
        fetchMessageThread.start();
    }
}

public synchronized void stopThread() {
    if (fetchMessageThread != null) {
        Log.i("Cancel thread", "stop thread");
        FetchMessageThread moribund = fetchMessageThread;
        currentCount = fetchMessageThread.tag == 0 ? 1 : 0;
        fetchMessageThread = null;
        moribund.interrupt();
    }
}

static class CustomHandler extends Handler {
    private final WeakReference<MainActivity> activityHolder;

    CustomHandler(MainActivity inboxListActivity) {
        activityHolder = new WeakReference<MainActivity>(inboxListActivity);
    }

    @Override
    public void handleMessage(android.os.Message msg) {

        MainActivity inboxListActivity = activityHolder.get();
        if (inboxListActivity.fetchMessageThread != null
                && inboxListActivity.currentCount == inboxListActivity.fetchMessageThread.tag) {
            Log.i("received result", "received result");
            inboxListActivity.fetchMessageThread = null;

            inboxListActivity.messageListAdapter
                    .setArrayList(inboxListActivity.recordsStored);
            inboxListActivity.progressDialogInbox.dismiss();
        }
    }
}

private OnCancelListener dialogCancelListener = new OnCancelListener() {

    @Override
    public void onCancel(DialogInterface dialog) {
        stopThread();
    }

};

}

Maxa answered 31/12, 2012 at 4:56 Comment(4)
This code snippet is from the prativas.wordpress.com. Here the messages are fetched from a different thread. If there is really long list of inbox messages from the device, then this code is really efficient.Maxa
nice, but also add some explanation if you can!Kreegar
@RobinHodd prativas.wordpress.com/category/android/… read this thoroughly and you will find the explanationMaxa
I mean to say, add explanation to this post, so others will get understand easily.Kreegar

© 2022 - 2024 — McMap. All rights reserved.