2012-02-21 17 views
5

Tôi muốn xây dựng một ứng dụng Android có thể liên lạc với người gọi hiện tại qua tin nhắn văn bản được xác định trước. Việc gửi tin nhắn văn bản đủ đơn giản nhưng việc xác định số điện thoại của người gọi hiện tại trong một ứng dụng độc lập là một thách thức. Có cách nào dễ dàng để thần thánh số điện thoại để tôi có thể gửi cho họ một tin nhắn trong khi vẫn còn trên cuộc gọi?Cách xác định số điện thoại của người gọi hiện tại trong một ứng dụng độc lập

Tất nhiên có các cách thủ công để thực hiện việc này: ghi lại số, nhập số đó vào tin nhắn văn bản mới, nhập tin nhắn. Nhưng tôi muốn xác định thông báo lên phía trước và có thể "gửi nó cho người gọi hiện tại".

+0

Vui lòng để lại một số mã về những gì bạn thực sự đã thử cho đến thời điểm này. Cái gì không hiệu quả? Ví dụ của tôi dường như sẽ làm điều đó. – EGHDK

Trả lời

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

    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context); 
    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
    helper = new ContactDatabaseHelper(context); 
    list = helper.getAllContacts(); 

    try{ 
     incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

     if (list.size() != 0){ 
      for (int i = 0, size = list.size(); i < size; i++){ 
       if (PhoneNumberUtils.compare(incomingNumber, list.get(i).getContactNumber())){     
        ToastMsg.showToast(context,list.get(i).getContactName()+" Calling"); 
       } 
      } 
     } 


    }catch (Exception e) { 
     // TODO: handle exception 
    } 

} 


public class PhoneCallStateListener extends PhoneStateListener{ 
private Context context; 

public PhoneCallStateListener(Context context){ 
    this.context = context; 
} 

@Override 
public void onCallStateChanged(int state, String incomingNumber) { 

    switch (state) { 

     case TelephonyManager.CALL_STATE_RINGING:  


      break; 
     case PhoneStateListener.LISTEN_CALL_STATE: 

    } 
    super.onCallStateChanged(state, incomingNumber); 
} 
} 
+0

Điều này có nghĩa là ứng dụng sẽ cần được tải mọi lúc để chặn các trạng thái cuộc gọi này không? –

+2

@ enforcer-99 Tôi không nghĩ rằng bạn hiểu khái niệm về BroadcastReciever. Đây là mô tả từ StackOverflow: "BroadcastReceiver là một thành phần Android đáp ứng các thông báo phát sóng trên toàn hệ thống". và đây là liên kết từ google mà bạn nên * thực sự * đọc. Do đó ... bạn đang đáp ứng với một hệ thống phát sóng rộng, và ứng dụng của bạn không phải là "nạp tất cả các thời gian". – EGHDK

3

Để bạn đánh giá tốt nhất, tôi có thể nghĩ là sử dụng PhoneStateListener. Nó chứa trình xử lý onCallStateChanged. Một trong các đối số là một Chuỗi chứa số điện thoại đến.

Nguồn: http://developer.android.com/reference/android/telephony/PhoneStateListener.html

Ctrl + F và gõ vào "Incoming" và bạn sẽ tìm thấy mọi thứ bạn cần biết.

EDIT: Để đảm bảo ứng dụng của bạn bắt đầu khi khởi động điện thoại, chỉ cần thêm BroadcastReciever. How to start an Application on startup?

+0

Nhưng còn trường hợp người dùng không gọi ứng dụng cho đến khi cuộc gọi điện thoại đang diễn ra? Vì sẽ không có sự kiện thay đổi trạng thái - tôi sẽ không thể lấy số đúng? –

+0

Có vẻ như bạn sẽ cần ứng dụng của mình bắt đầu khi khởi động. Điều này tương tự như những ứng dụng như "Google Wallet". Khi tôi đi đến một cửa hàng và bấm vào điện thoại của tôi để trả tiền, tôi không bao giờ phải mở ví Google để nó hoạt động. Tuy nhiên, khi tôi bật điện thoại và nhìn vào thông báo của mình, tôi thấy rằng "Khởi tạo Google Wallet" thực sự nhanh chóng và sau đó biến mất. Hiện không có nhiều thời gian, nhưng có thể điều này sẽ giúp: http://stackoverflow.com/questions/5290141/android-broadcastreceiver-on-startup – EGHDK

+0

Nếu tôi vừa kiểm tra nhật ký cuộc gọi Android thì sao? Nếu tôi sắp xếp danh sách theo ngày DESC, nó sẽ hiển thị cuộc gọi hiện tại mà tôi đang thực hiện hay cuộc gọi hiện tại bị đẩy tới nhật ký cuộc gọi SAU KHI cuộc gọi kết thúc? –

1

Đăng ký BroadcastReceiver trong tệp kê khai của bạn nghe theo số ACTION_PHONE_STATE_CHANGED.

Hành động mục đích phát sóng cho biết trạng thái cuộc gọi (di động) trên thiết bị đã thay đổi.

Số EXTRA_STATE bổ sung cho biết trạng thái cuộc gọi mới. Nếu trạng thái mới là RINGING, số phụ thêm EXTRA_INCOMING_NUMBER sẽ cung cấp số điện thoại đến dưới dạng Chuỗi.

Yêu cầu quyền đối với số READ_PHONE_STATE.

Đây là chương trình phát sóng dính trong phiên bản 1.0 nhưng không còn là dính. Thay vào đó, hãy sử dụng getCallState() để truy vấn đồng thời trạng thái cuộc gọi hiện tại.

Bằng cách này bạn không cần người dùng khởi chạy ứng dụng của mình trước khi nhận cuộc gọi.

+0

Điều này thì sao? : "Theo Android 3.1, hệ thống Android theo mặc định sẽ loại trừ tất cả BroadcastReceiver khỏi việc nhận Intents nếu ứng dụng tương ứng chưa bao giờ được người dùng bắt đầu hoặc nếu người dùng dừng ứng dụng một cách rõ ràng qua menu Android (trong Quản lý ứng dụng). là một tính năng bảo mật bổ sung khi người dùng có thể chắc chắn rằng chỉ những ứng dụng mà anh ta mới bắt đầu mới nhận được mục đích phát sóng. " –

Các vấn đề liên quan