2017-03-14 14 views
8

tôi biết rằng chúng tôi có thể nghe trạng thái điện thoại bằng cách thu phát sóng với bộ lọc androidAndroid: Incoming gọi người nghe mà không được phép

hành động: name = "android.intent.action.PHONE_STATE"

nhưng Bằng cách này đòi hỏi phải có sự cho phép

sử dụng-phép android: name = "android.permission.READ_PHONE_STATE"

Cách xác định cuộc gọi GSM đến mà không có sự cho phép này?

P.S.

Tôi chắc chắn rằng điều này có thể là do Whatsapp đang thực hiện.
Khi tôi đang nói chuyện trên các cuộc gọi âm thanh Whatsapp và sau đó nhận cuộc gọi gsm đến - whatsapp kiểm tra nó và đặt tự cuộc gọi để tạm dừng. Làm thế nào để họ hiểu rằng cần thiết lập tạm dừng?

Whatsapp có quyền READ_PHONE_STATE trong tệp kê khai, nhưng tôi kiểm tra cuộc gọi trên Android 6 và không được cấp quyền này. Quyền này đã bị vô hiệu hóa.

Khi quyền này bị tắt, Người nhận của tôi không nhận được hành động android.intent.action.PHONE_STATE và PhoneStateListener không hoạt động.

+0

'Tôi cần một số cơ chế' - sau đó viết mã của bạn và quay lại nếu bạn gặp phải bất kỳ vấn đề thực sự nào. Bắt đầu cho mã trong ngụy trang của tiền thưởng là thảm hại. –

Trả lời

8

Tôi đã tìm thấy giải pháp mà không có sự cho phép này.

Trước hết (khi bắt đầu cuộc gọi ngụm của chúng tôi) chúng ta cần yêu cầu tập trung âm thanh với lisener

mAudioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN); 

Các afChangeListener thể cho chúng tôi tập trung âm thanh sau đó ai đó đã thay đổi và sau đó chúng ta có thể kiểm tra kênh âm thanh hiện tại. Nếu chế độ hiện tại là AudioManager.MODE_IN_CALL hoặc AudioManager.MODE_RINGTONE thì chúng tôi biết rằng cuộc gọi gsm đã bắt đầu.

AudioManager.OnAudioFocusChangeListener afChangeListener = 
     new AudioManager.OnAudioFocusChangeListener() { 
      public void onAudioFocusChange(int focusChange) { 

       if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { 
        // Permanent loss of audio focus 
        // Pause playback immediately 
       } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) { 
        ScheduledExecutorService scheduler = App.getInstance().obtainScheduler(); 
        scheduler.schedule(() -> { 
         Logging.i(TAG, "onAudioFocusChange defer mode = " + mAudioManager.getMode()); 
         switch (mAudioManager.getMode()) { 
          case AudioManager.MODE_RINGTONE: 
          case AudioManager.MODE_IN_CALL: 
           //**there we can start standby mode** 
           break; 
         } 
        }, 100, TimeUnit.MILLISECONDS); 

       } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { 
        Logging.i(TAG, "onAudioFocusChange AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); 
        // Lower the volume, keep playing 
       } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
        // Your app has been granted audio focus again 
        //**there we can stop standby mode** 
       } 

      } 
     }; 
0

Khi thiết bị Android nhận được cuộc gọi điện thoại của Activity đang được hiển thị trước khi cuộc gọi điện thoại tự động được gọi và bạn có thể tạm dừng cuộc gọi ở đó.

+1

thử tốt nhưng không. Điều này hoạt động ngay cả khi whatsapp CallActivity bị thu gọn. –

2

Trước hết whatsapp dùng phép mà yêu cầu để có được trạng thái điện thoại

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

Đây là WhatsApp tập tin menifest link.

Bạn có thể thấy họ đã thêm và sử dụng chúng bên trong nó.

Android tự cung cấp giải pháp tốt nhất để xử lý nó bằng cách sử dụng bộ thu sóng phát sóng.Bạn nên sử dụng những hệ thống này nếu không hệ thống của bạn sẽ bị tấn công.

Làm theo các link này để làm việc với bộ thu phát sóng để phát hiện cuộc gọi điện thoại.

Hy vọng những điều này sẽ giúp bạn.

+0

Kiểm tra cập nhật, vui lòng –

+0

@DmitriyP bạn có thể đăng tệp kê khai của mình không. Tôi kiểm tra với phiên bản hiện tại của tôi nó hiển thị như nhau. –

0

Bạn có thể làm điều này bằng phương pháp onReceive với số điện thoại và tất cả chi tiết có cuộc gọi đến.

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