2

我試圖編寫我的項目的代碼,當WiFi連接斷開連接時播放音樂,並且每當用戶單擊「測試」按鈕時它顯示當前連接強度。我試過下面的代碼:當WiFi連接斷開時播放音樂

主要業務部分(用於測試按鈕,調出類AlarmManagerBroadcastReceiver:

public class MainActivity extends FragmentActivity { 

    public static final String TAG = "Final Year Project"; 
    private static boolean wifiConnected = false; 
    private static boolean mobileConnected = false; 

    private LogFragment mLogFragment; 

    private AlarmManagerBroadcastReceiver alarm ; 

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


    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 
    registerReceiver(alarm, intentFilter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      // When the user clicks TEST, display the connection status. 
      case R.id.test_action: 
       checkNetworkStrengh(); 
       return true; 
      // Clear the log view fragment. 
      case R.id.clear_action: 
       mLogFragment.getLogView().setText(""); 
       return true; 
     } 
     return false; 
    } 

    private void checkNetworkStrengh() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo Info = cm.getActiveNetworkInfo(); 
     if (Info == null || !Info.isConnectedOrConnecting()) { 
      Log.i(TAG, "No connection"); 
     } else { 
      int netType = Info.getType(); 
      int netSubtype = Info.getSubtype(); 

      if (netType == ConnectivityManager.TYPE_WIFI) { 
       Log.i(TAG, "Wifi connection"); 
       WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE); 
       List<ScanResult> scanResult = wifiManager.getScanResults(); 
       for (int i = 0; i < scanResult.size();) { 
        Log.d("scanResult", "Speed of wifi" + scanResult.get(i).level);//The db level of signal // 

         // its okay now thanks guys //  
       } 


      } else if (netType == ConnectivityManager.TYPE_MOBILE) { 

       Log.i(TAG, "GPRS/3G connection"); 

       // Need to get differentiate between 3G/GPRS 
      } 
     } 
    } 
} 

AlarmManagerBroadcastReceiver部分(以掃描當前網絡的連接所有的時間創建) :

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { 

    private static boolean wifiConnected = false; 
    private static boolean mobileConnected = false; 

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


    if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 
     NetworkInfo networkInfo = 
       intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
     if (networkInfo.isConnected()) { 
      // Wifi is connected 
      Intent in = new Intent(context, RingService.class); 
      context.stopService(in); 
     } else { 
      Intent in = new Intent(context, RingService.class); 
      context.startService(in); 

     } 
    } 

} 

和MusicService部分(以播放音樂創建每當類AlarmMAnagerBroadcastReceiver觸發特定條件):

public class MusicService extends Service{ 

    private MediaPlayer mp; 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 
     mp.start(); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       try { 
        mp.start(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
     mp.setOnErrorListener(new MediaPlayer.OnErrorListener() { 

      public boolean onError(MediaPlayer mp, int what, int extra) { 
       // TODO Auto-generated method stub 
      try { 
        mp.release(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       return false; 
      } 
     }); 

     super.onStart(intent, startId); 
    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     try { 
      mp = new MediaPlayer(); 
      mp = MediaPlayer.create(MusicService.this, R.raw.ly); 
      mp.prepare(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     mp.stop(); 
     mp.release(); 
     super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

清單文件

 <service 
 
      android:name="com.example.android.basicnetworking.RingService" 
 
      android:exported="true" 
 
      android:process=":remote" > 
 
     </service> 
 
      
 
        <receiver android:name=".AlarmManagerBroadcastReceiver" > 
 
      <intent-filter android:priority="100" android:enabled="true" 
 
       android:label="ConnectivityActionReceiver"> 
 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
 
       <action android:name="android.net.wifi.STATE_CHANGE" /> 
 
      </intent-filter> 
 

 
     </receiver>

人誰是專業從事機器人編程幫助我的代碼因爲我是在Android和Java編程新)能獲得重返checkConnectivity類的AlarmManagerBroadcastReceiver部分,也可以在無線連接丟失時播放音樂。

編輯:謝謝你的幫助。我已經知道了。如果有人需要這些代碼,您可以收件箱,否則一旦一切正常,我會上傳完整的代碼。

編輯:更新了一些代碼

+0

參見[這個問題](http://stackoverflow.com/questions/5888502/how-to-detect-when-wifi-connection在Android中已建立)以獲得WiFi連接或斷開 –

+0

@IchigoKurosaki他已經得到了那 – Gavriel

+1

可能的重複[在Android中獲得WiFi信號強度](http://stackoverflow.com/questions/13932724/越來越無線信號強度在Android) – Gavriel

回答

1
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
int numberOfLevels = 5; 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels); 

當您嘗試再次播放音樂,那麼你需要重新準備,所以開始通話之前每次準備以及:

這增加AlarmManagerBroadcastReceiver:

void play(int musicId) { 
    MediaPlayer mp = MediaPlayer.create(getContext(), musicId); 
    mp.prepare(); 
    mp.start(); 
} 

和checkConnectivity要播放音樂:

play(R.raw.ly); // or use other resource instead of ly 
+0

謝謝,我已經得到了 –

+0

我需要在AlarmManagerBroadcastReceiver活動checkConnectivity類中的代碼,你能幫我一個收藏? –

0

上斷開播放聲音...試試這個:

 public class NetworkReceiver extends BroadcastReceiver { 
      static boolean isConnect = false; 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.d(TAG, "network changed"); 
       ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
       NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); 
       if (activeNetwork != null) { // connected to the internet 
        if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { 
         Log.d(TAG, "network type wifi"); // connected on wifi 

        } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { 
         Log.d(TAG, "network type mobile"); // connected on mobile (3g/4g) 
        } 
       } else { 
        isConnect = false; 
        Log.d(TAG, "no connection"); // DISCONNECTED 
        playMySound(); // <- your play sound function 
       } 

      } 

      public void playMySound() { 
       MediaPlayer sound = MediaPlayer.create(context, R.raw.song); 
       sound.start(); 
      } 
     } 
+0

我會嘗試一下,謝謝mr.Lucas! –

+0

我得到這個錯誤:無法解析符號'上下文',在聲明中MediaPlayer sound = MediaPlayer.create(context,R.raw.song); ,我嘗試了很多方法來解決,但它沒有工作 –

+0

I'hv通過另一種方式解決了這個問題。 –