2014-10-20 127 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

相關問題