2013-12-09 126 views
2

我正在製作和記錄通話的應用程序。這是我的代碼來記錄一個電話並將文件保存在SD卡下的歌曲文件夾下。但問題是這段代碼工作正常,但後來無法正常工作。我找不到有什麼問題。你能幫我解決嗎?在android中撥打電話的代碼

我撒施接收器:

public class BrCallReceive extends BroadcastReceiver { 

     @Override 
    public void onReceive(Context c, Intent i) { 

     Bundle extras = i.getExtras(); 
     Intent x = new Intent (c, EavesDropperActivity.class); 
     x.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     if (extras != null) { 
      String state = extras.getString(TelephonyManager.EXTRA_STATE); 
      Log.w("DEBUG", state); 
      if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
       Log.w("DEBUG", "MATCHES"); 
       Toast.makeText(c, "Launching record APP !", Toast.LENGTH_LONG).show(); 
       c.startActivity(x); 
      } 
     } 
    } 
} 

我的錄音活動:

public class EavesDropperActivity extends Activity { 

    /** Called when the activity is first created. */ 
    MediaRecorder m_recorder = new MediaRecorder(); 
    TelephonyManager t_manager ; 
    PhoneStateListener p_listener ; 
    String record_state; 
    Uri file; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.main); 
     Toast.makeText(getBaseContext(), 
       "Executing Activity", 
       Toast.LENGTH_LONG).show(); 

     t_manager = (TelephonyManager) getSystemService (Context.TELEPHONY_SERVICE); 
     p_listener = new PhoneStateListener() { 
      @Override 
      public void onCallStateChanged (int state, String incomingNumber) { 
       switch (state) { 
        case (TelephonyManager.CALL_STATE_IDLE)  : 
         stop_recorder(); 

         //t_manager.listen(p_listener, PhoneStateListener.LISTEN_NONE); 
         //finish(); 
         break; 

        case (TelephonyManager.CALL_STATE_OFFHOOK)  : 

         start_recorder(); 

         break; 
        case (TelephonyManager.CALL_STATE_RINGING)  : 

         break; 

       } 
      } 
     }; 
     t_manager.listen(p_listener, PhoneStateListener.LISTEN_CALL_STATE); 
     return; 
    } 

    public void start_recorder() { 
     m_recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     m_recorder.setOutputFormat(OutputFormat.THREE_GPP); 
     m_recorder.setOutputFile(Environment.getExternalStorageDirectory()+"/songs/audionew.3gpp"); 
     m_recorder.setAudioEncoder(AudioEncoder.AMR_NB); 

     try { 
      m_recorder.prepare(); 
      m_recorder.start(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void stop_recorder() { 
     m_recorder.stop(); 
     m_recorder.release(); 
     Uri file = Uri.fromFile(
       new File(Environment.getExternalStorageDirectory(),"/songs/audionew.3gpp")); 
     Toast.makeText(getBaseContext(), 
       "record stored at " + file.toString(), 
       Toast.LENGTH_LONG).show(); 

     t_manager.listen(p_listener, PhoneStateListener.LISTEN_NONE); 
     finish(); 
    } 
} 

我的清單:

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

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.testapp.EavesDropperActivity" 
      android:label="@string/app_name" > 
    </activity> 

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

</manifest> 
+0

任何logcat的?當你說它停止工作,以前它曾經工作時,你究竟意味着什麼? –

+0

事情是,當我在我的設備上安裝apk並運行它時,它不起作用。早些時候,相同的代碼能夠記錄電話。但現在安裝後沒有任何事情發生。該apk只是安裝,沒有任何事情發生。 – user3080161

+0

我的設備是android 4.1.2 – user3080161

回答

1

我認爲廣播接收器是沒有得到激活欺騙我是撥打我的電話。

你怎麼知道你的廣播接收機不工作?將onReceive()內的日誌消息放置在開頭。這可能是你的extras == null

但如何使我的接收機功能現在呢?

退房example #5只需按照相同的步驟。

兄弟我不認爲活動將啓動。

那麼,它:你開始在你的onReceive():

Intent x = new Intent (c, EavesDropperActivity.class); 
c.startActivity(x); 

但是,你是不是設置在活動的內容即是沒有提出UI屏幕,因爲你有這樣的行評論在EavesDropperActivity活動的onCreate()

//setContentView(R.layout.main); 

所以,你需要艱苦認爲你試圖在EavesDropperActivity

達到什麼

HTH。

+0

我已經把我的main.xml的評論,因爲我不想做任何事情WID這一點。所以我修改了我的清單文件。在EavesDropperActivity我是絕對記錄和停止和保存在SD卡中的文件。所以這就是爲什麼我把這個評論。而且我還通過將登錄日誌放在onreceiver上,但登錄貓沒有顯示日誌。 – user3080161

+0

嘗試之前工作的設備上的代碼。可能是您現在用於測試的設備已損壞。如果代碼沒有改變,那麼測試設備就是一個嫌犯。 –

+0

如果你只是記錄和停止並保存在SD卡中的文件,你應該選擇一個啓動的IntentService,而不是一個活動。人們通常在使用活動時,他們必須顯示一些用戶界面元素和用戶的輸入。由於您不需要任何用戶干預,因此請考慮服務。但是這仍然不能解釋爲什麼代碼在以前的設備上工作,而不是在新設備上工作。 –

0

把這個

<android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 


<action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
在廣播接收機mainfest文件

0

添加您的包名到您的接收器類中,

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

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.testapp.EavesDropperActivity" 
      android:label="@string/app_name" > 
    </activity> 

    <receiver android:name="com.example.testapp.BrCallReceive" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" > 
       </action> 
      </intent-filter> 
     </receiver> 
    </application>