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

ⅰ亾dé卋堺 提交于 2019-12-28 12:00:31

问题


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.


回答1:


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




回答2:


    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();
    }

};

}



来源:https://stackoverflow.com/questions/14097500/get-inbox-messages-from-android-device-to-show-in-custom-listview

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!