2013-07-07 184 views
0

我想要一個應用程序來獲取來電號碼,如果來自特定號碼的電話然後做一些事情。即使在應用程序未運行時,我也想獲取來電號碼。我正在使用BraodcastReceiver獲取來電號碼。收到廣播

我有兩個Java類擴展他的活動,另一個擴展BraodcastReceiver獲取來電號碼。

延伸活動主要類:

package digicare.ringmanager; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class Main_Activity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_layout); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main_layout, menu); 
     return true; 
    } 
} 

它是非常簡單,它擴展了BroadcastReceiver數檢查類:

package digicare.ringmanager; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class number_checker extends BroadcastReceiver { 
    private int ringer_mode ; 
    private String AM_str; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     AudioManager AM =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
     Log.w("start", "starting the Main_Activity"); 

     AM_str=String.valueOf(ringer_mode); 
     Log.w("Ringer_mode at start", AM_str); 

     //setting the ringer mode on number match 
     try { 
      Bundle extras=intent.getExtras(); 
      if (extras !=null){ 

       String state = extras.getString(TelephonyManager.EXTRA_STATE); 
       Log.w("state at start",state); 
       if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
        String phonenumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 


        //AM.setRingerMode(1); 
        ringer_mode =AM.getRingerMode(); 
        AM_str=String.valueOf(ringer_mode); 
        Log.w("Ringer_mode at ringing", AM_str); 

        Log.w("Number", phonenumber); 

        if (phonenumber.equals("1234")){ 
         Log.w("yahoo", "Number matched"); 

         if (ringer_mode==AudioManager.RINGER_MODE_SILENT || ringer_mode==AudioManager.RINGER_MODE_VIBRATE){ 

          AM.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
          Log.w("Phone number is matched .!", "Now , ringer mode is normal"); 
          int now_nor =AM.getRingerMode(); 
          String now_nor_str=String.valueOf(now_nor); 
          Log.w("ring_mode at num matched",now_nor_str); 

         } 
        } 

       } 
       if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK) || state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 

        int now_nor =AM.getRingerMode(); 
        String now_nor_str=String.valueOf(now_nor); 
        Log.w("ring_mode at offHock",now_nor_str); 

        if (ringer_mode==AudioManager.RINGER_MODE_NORMAL){ 
         AM.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
         Log.w("Normal", ""); 
        }else if (ringer_mode==AudioManager.RINGER_MODE_SILENT){ 
         AM.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
         Log.w("silent", ""); 
        }else if (ringer_mode==AudioManager.RINGER_MODE_VIBRATE){ 
         AM.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
         Log.w("vibrat", ""); 
        } 
        // Log.w("Again", "Now the Ringer mode is get back "); 

        int now =AM.getRingerMode(); 
        String now_str=String.valueOf(now); 
        Log.w("ring_mode at end ",now_str); 
       } 
      } 
     } catch (Exception e) { 
      // TODO: handle exception 
      Log.w("MY_DEBUG_TAG", e); 

     } 
    } 
} 

而且AndroidManifist.xml是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="digicare.ringmanager" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
    android:minSdkVersion="5" 
    android:targetSdkVersion="17" /> 

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


    <application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="digicare.ringmanager.Main_Activity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

     <receiver android:name="number_checker" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE"/> 


     </intent-filter> 

    </receiver> 

    </application> 

    </manifest> 

但這不起作用,這不能得到來電號碼。 我可以做嗎?必須調用number_checker類來註冊Braodcast?

請幫助我是一個新的Android開發

+0

[顯示在接收呼叫時顯示Notification]的可能重複(http://stackoverflow.com/questions/17390779/notification-shown-on-receiving-call-not-showing) – Ayush

回答

0

您可以動態註冊這個類的一個實例與Context.registerReceiver()或靜態地在你的AndroidManifest.xml發佈通過標籤的實現。

注意:如果在您的Activity.onResume()實施中註冊接收器,則應該在Activity.onPause()中取消其註冊。 (暫停時不會收到意圖,這將減少不必要的系統開銷)。不要取消註冊Activity.onSaveInstanceState(),因爲如果用戶移回到歷史堆棧中,則不會調用它。

也檢查此鏈接:

http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html

新的更新

檢查此鏈接http://androidexample.com/Incomming_Phone_Call_Broadcast_Receiver__-_Android_Example/index.php?view=article_discription&aid=61&aaid=86

更新2

把接收者名稱前10個。像這樣<receiver android:name=".number_checker" >

+0

是的我提到了在androidmanifist中播放。 現在我編輯問題請檢查。 – natiq

+0

天氣我必須調用Main_Activity中的nunber_checker類? – natiq

+0

我不希望那個應用程序總是在運行。但我想要收到的號碼,即使應用程序不運行 我在androidmanifist中提到 ..是該類自動運行?當應用程序每次運行時? 或者我必須從我的main_Activity調用這個類? – natiq