2014-10-20 132 views
0

我是新开发的Android开发人员(但不是Java),我正在编写自己的Android通讯应用程序,希望能够取代默认的短信应用程序。我的问题是 - 默认的短信应用程序如何跟踪发送和接收的消息,以及如何完成相同的任务?具体而言,我无法弄清楚如何查找,存储和显示设备用户与其联系人列表中的成员之间的对话历史记录。我还没有任何初步的代码,因为坦率地说,我不知道从哪里开始。如何在android消息传递应用程序中跟踪发送和接收的消息?

编辑:试图设置一个BroadcastReceiver作为第一步(得到开始某处),但我努力让我的应用程序在通知通过设备(我使用模拟器)时触发。

这里是我的广播接收器类(基于例如从下面)

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.provider.Telephony; 
import android.telephony.SmsManager; 
import android.telephony.SmsMessage; 
import android.util.Log; 


public class smsBroadcastReceiver extends BroadcastReceiver { 
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
    private static final String TAG = "smsBroadcastReceiver"; 
    private static final String SMS_SENT = "android.provider.Telephony.SMS_SENT"; 
    final SmsManager mySMSManager = SmsManager.getDefault(); 
    String phoneNumber, message; 

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

     if (intent.getAction().equals(SMS_RECEIVED)) handleIncMessage(intent.getExtras(), context); 
     else if (intent.getAction().equals(SMS_SENT)) sendSMS(intent.getExtras(), context); 

    } 

    void sendSMS(Bundle bundle, Context context){ 
     phoneNumber = bundle.getString(Intent.EXTRA_PHONE_NUMBER); 
     Log.e("info", "Outgoing Number: " + phoneNumber); 
     context.sendBroadcast(new Intent("onNewMsgSend")); 
    } 


    void handleIncMessage(Bundle bundle, Context context) { 
     if (bundle != null) { 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      //database stuff... 
      final SmsMessage[] messages = new SmsMessage[pdus.length]; 
      for (int i = 0; i < pdus.length; i++) { 
       String sendingNum = messages[i].getDisplayOriginatingAddress(); 
       messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       String message = messages[i].getDisplayMessageBody(); 

       Intent msgIntent = new Intent(context, conversationView.class); 
       msgIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK 
         | Intent.FLAG_ACTIVITY_CLEAR_TOP 
         | Intent.FLAG_ACTIVITY_NEW_TASK); 

       context.startActivity(msgIntent); 

       // Log.i(TAG, "SENDER: " + sendingNum +"; Message: " + message); 
       System.out.println("SENDER: " + sendingNum +"; Message: " + message); 
      } 
      context.sendBroadcast(new Intent("onNewMsg")); 
     } 
    } 
} 

我最好的猜测是,我做错了什么在我的活动,但我不知道是什么。是否需要将我的意图发送给我的主要(启动)活动,然后从那里委托意向,还是可以将它发送给不是启动器的活动(这正是我现在要做的)?

编辑:BroadcastReceiver问题解决。

+0

一个良好的开端将是联系人同意您的应用程序,你可以在这里找到http://developer.android.com/training/contacts-provider/检索,names.html。你可以很容易地搜索他们的联系人列表,所以它应该是非常简单的。 – ed209 2014-10-20 02:58:15

+0

我已经在清单文件中建立了联系人权限,并且正在阅读/显示联系人。我真正的问题是如何跟踪用户和他们联系人列表中的成员之间发送和接收的消息,并将其显示在默认的SMS应用程序那样的对话式视图中。 – CoffeeSaurus 2014-10-21 21:48:07

回答

1

试试这个办法,希望这将帮助你解决你的问题

步骤1.

这是首次置业类

public class MainActivity extends Activity { 

Context context; 
Activity act; 
ListView lvsms; 
public static String msg = "msg", phoneNo = "phoneNo", time = "time"; 

public static String typeMsg = "0"; 
public static String typeSend = "1"; 
// String typeDeliver = "2"; 

TextView smsno_record; 

SimpleCursorAdapter adapter1; 

BroadcastReceiver onNewMsg = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    } 
}; 

BroadcastReceiver onNewMsgSend = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    } 
}; 

// BroadcastReceiver deliveredreceiver = new BroadcastReceiver() { 
// @Override 
// public void onReceive(Context context, Intent intent) { 
// 
// } 
// }; 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(onNewMsg); 
    unregisterReceiver(onNewMsgSend); 
    // unregisterReceiver(deliveredreceiver); 
} 

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

    registerReceiver(onNewMsg, new IntentFilter("onNewMsg")); 
    registerReceiver(onNewMsgSend, new IntentFilter("onNewMsgSend")); 
    // registerReceiver(deliveredreceiver, new IntentFilter(
    // "deliveredreceiver")); 
    setContentView(R.layout.complete_sms_data); 
    context = MainActivity.this; 
    act = MainActivity.this; 

    lvsms = (ListView) findViewById(R.id.lvsms); 
    smsno_record = (TextView) findViewById(R.id.smsno_record); 
    smsdetails(typeMsg);//  sendboxSMS(); 

} 

void smsdetails(String type) { 
    Database db = new Database(context); 
    // ArrayList<HashMap<String, String>> al = db.getRecord(type); 
    LinkedList<HashMap<String, String>> al = db.getRecord(type); 
    Log.e("test", "sms al :- " + al.size()); 
    db.close(); 
    for (int i = 0; i < al.size(); i++) { 
     HashMap<String, String> hm = al.get(i); 
     String name = getName(getContentResolver(), hm.get(phoneNo)); 
     hm.put("name", hm.get(phoneNo) + " " + name); 
     Log.e("test", "name :- " + name); 
    } 
    if (al.size() > 0) { 
     lvsms.setVisibility(View.VISIBLE); 
     CustomAdapter adapter = null; 

     if (type.equals(typeMsg)) { 

      Log.e("test", "if condition 1st"); 

      adapter = new CustomAdapter((Activity) context, al); 
      lvsms.setAdapter(adapter); 
      // adapter = new SimpleAdapter(context, al, 
      // R.layout.list_items_msgs, new String[] { "name", msg, 
      // time }, new int[] { R.id.txtPhoneNo, 
      // R.id.txtMsg, R.id.txtTime }); 
     } else if (type.equals(typeSend)) { 
      Log.e("test", "if condition 2st"); 
      adapter = new CustomAdapter((Activity) context, al); 
      lvsms.setAdapter(adapter); 
      // adapter = new SimpleAdapter(context, al, 
      // R.layout.list_items_msgs, new String[] { "name", msg, 
      // time }, new int[] { R.id.txtPhoneNo, 
      // R.id.txtMsg, R.id.txtTime }); 
     } 
     // else if (type.equals(typeDeliver)) { 
     // adapter = new SimpleAdapter(context, al, 
     // R.layout.list_items_msgs, new String[] { "name", msg, 
     // time }, new int[] { R.id.txtPhoneNo, 
     // R.id.txtMsg, R.id.txtTime }); 
     // } 
     lvsms.setAdapter(adapter); 
     smsno_record.setVisibility(View.GONE); 
    } else { 
     Log.e("test", "else condition "); 
     lvsms.setAdapter(null); 
     lvsms.setVisibility(View.GONE); 
    } 

} 

}

第2步。 这是你的短信接收器

public class Receiver extends BroadcastReceiver { 

final SmsManager sms = SmsManager.getDefault(); 
String phoneNumber, message; 

public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(
      "android.provider.Telephony.SMS_RECEIVED")) { 

     handleIncomingMsg(intent.getExtras(), context); 

    } else if (intent.getAction().equals(
      "android.provider.Telephony.SMS_SENT")) { 

     sendSMS(intent.getExtras(), context); 

    } 


} 

void handleIncomingMsg(Bundle bundle, Context context) { 
    Object[] pdusObj = (Object[]) bundle.get("pdus"); 
    Database db = new Database(context); 
    for (int i = 0; i < pdusObj.length; i++) { 
     SmsMessage currentMessage = SmsMessage 
       .createFromPdu((byte[]) pdusObj[i]); 
     String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 
     String senderNum = phoneNumber; 
     String message = currentMessage.getDisplayMessageBody(); 

     Intent in1 = new Intent(context, MainActivity.class); 
     in1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK 
       | Intent.FLAG_ACTIVITY_CLEAR_TOP 
       | Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(in1); 

     Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " 
       + message); 
     db.insertRecord(senderNum, message, MainActivity.typeMsg); 
    } 
    context.sendBroadcast(new Intent("onNewMsg")); 
    db.close(); 
} 

void sysAlert(String title, String msg, Context context) { 
    AlertDialog alert = new AlertDialog.Builder(context).setTitle(title) 
      .setMessage(msg) 
      .setNegativeButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
       } 
      }).create(); 
    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
    alert.setCanceledOnTouchOutside(false); 
    alert.show(); 
} 

public void onDestroy() { 
    telephony.listen(null, PhoneStateListener.LISTEN_NONE); 
} 

TelephonyManager telephony; 

MyPhoneStateListener phoneListener; 
boolean ring = false; 
boolean callReceived = false; 



void handleCalls(Context context) { 
    if (phoneListener == null) { 
     phoneListener = new MyPhoneStateListener(context); 
     telephony = (TelephonyManager) context 
       .getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(phoneListener, 
       PhoneStateListener.LISTEN_CALL_STATE); 

    } 
} 

void sendSMS(Bundle bundle, Context context) { 
    phoneNumber = bundle.getString(Intent.EXTRA_PHONE_NUMBER); 
    Log.e("info", "Outgoing Number: " + phoneNumber); 

    Database db = new Database(context); 

    db.insertRecord(phoneNumber, "hii", MainActivity.typeSend); 
    // 
    // } 
    db.close(); 
    context.sendBroadcast(new Intent("onNewMsgSend")); 
} 



} 

九月3 认沽权限mainfest

<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+0

谢谢!我会给你一个镜头,让你知道这是怎么回事。 – CoffeeSaurus 2014-10-21 21:45:23

+0

NP,我们使用接收器接收新的短信,当新的短信到来时,我们可以将新的短信放在任何位置的sqlite或服务器。您还需要注册接收器 – Saveen 2014-10-22 00:31:13

+0

似乎好像在遇到新消息时让我的应用程序启动时遇到问题。我不确定发生了什么,所以我在上面发布了我的接收器代码。 – CoffeeSaurus 2014-10-28 04:18:26

相关问题