2013-03-06 24 views
4

我正在開發一款將在工業環境中用作手持控制器的Android應用程序。爲了讓平板電腦不太適合帶回家,我試着以編程方式始終打開飛行模式,但在4.2版本中已棄用此版本,這也是我們爲了獲得Android Open Accessory而使用的版本。但是我在想,如果我可以在清單中註冊一個接收器,以便隨時啓動我的應用程序飛行模式被更改,然後檢查它是否關閉並提示用戶重新打開它。清單中的飛機模式接收器?

我已經嘗試了下面的這個解決方案,也發現了作爲this問題的答案。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<receiver android:name=".receiver.ConnectivityReceiver"> 
<intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
</intent-filter> 
</receiver> 

我自己也嘗試這樣的代碼:

<receiver android:enabled="true" android:name=".ConnectivityReceiver"> 
<intent-filter> 
    <action android:name="android.intent.action.SERVICE_STATE"/> 
</intent-filter> 
</receiver> 

還發現,通過saxos here的aswer。

現在,這些解決方案都不會導致我的應用程序在飛行模式更改時啓動。

是否有可能在清單文件中爲Airplane模式註冊BroadcaseReceiver並讓該應用程序啓動?

編輯1:我確實有在Java代碼中工作的BroadcastReceiver,所以我可以在我的應用程序處於活動狀態時檢測到這種情況。這不是我所期待的。謝謝。

編輯2:這是我整個清單目前文件:

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

<uses-sdk 
    android:minSdkVersion="17" 
    android:targetSdkVersion="17" 
    android:maxSdkVersion="17"/> 
    <!-- SDK 14 = 4.0 ICS 
     SDK 17 = 4.2 JB -->    

<!-- Assures software is not loaded onto unsupported screen size, i.e. phones --> 
<supports-screens android:xlargeScreens="true" 
    android:largeScreens="true" 
    android:normalScreens="false" 
    android:smallScreens="false" 
    android:anyDensity="true"/> 

<uses-feature android:name="android.hardware.usb.accessory"/> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.i2c.mainActivity" 
     android:label="@string/app_name" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.AIRPLANE_MODE" /> 
     </intent-filter> 
     <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" 
      android:resource="@xml/accessory_filter"/> 
    </activity> 
</application> 

USB_ACCESSORY ATTACHEDMAIN發射器的工作就好了,開始我的應用程序從onCreate點。然而AIRPLANE_MODE似乎沒有做任何事情。

這裏是我的廣播接收器是在Java代碼中:

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("I2CActivity", "onReceive of BroadcastReceiver()"); 
     String action = intent.getAction(); 
     if(ACTION_USB_PERMISSION.equals(action)) { 
      Log.d("ACTION_USB_PERMISSION", action.toString()); 
      synchronized (this) { 
       Log.d("syncronized", this.toString()); 
       UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 
       if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (accessory != null) { 
         OpenAccessory(accessory); 
        } 
       } 
       else { 
        Log.d("mUsbReceiver", "permission denied for accessory " + accessory); 
       } 
      } 
     } 
     else if(UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) { 
      Log.d("ACTION_USB_ACCESSORY_ATTACHED", action.toString()); 
      UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 
      if (accessory != null) { 
       resumeAccessory(); 
      } 
     } 
     else if(UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { 
      Log.d("ACTION_USB_ACCESSORY_DETACHED", action.toString()); 
      UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 
      if (accessory != null) { 
       closeAccessory(); 
      } 
     } 
     else if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) { 
      Log.e("Airplane Mode", "Airplane mode changed"); 
      airplaneMode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; 
     } 
    } 
}; 
但是從我的理解

這只是註冊的應用程序正在運行的時候,我想那是連註冊的接收器時,應用程序不運行。

+0

yes可能的用途 DjHacktorReborn 2013-03-06 15:12:17

+0

@DjHacktorReborn我需要有任何'uses-permission'標籤嗎?謝謝。 – TronicZomB 2013-03-06 15:13:50

+0

nopes你不需要 – DjHacktorReborn 2013-03-06 15:14:34

回答

7

有了更深入的瞭解Intents和XML定義接收我能算出這個片段。這僅在API 17上進行了測試。這裏是清單的代碼:

<receiver android:name="com.example.i2c.AirplaneModeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.AIRPLANE_MODE"/> 
    </intent-filter> 
</receiver> 

然後創建一個名爲AirplaneModeReceiver一個Java類文件,並把它下面:

public class AirplaneModeReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Intent startActivityIntent = new Intent(context, MainActivity.class); 
     startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(startActivityIntent); 
    }  
} 

現在只要有這將啓動活動改變飛行模式,開啓或關閉。我沒有追求編寫檢查飛行模式是否關閉的代碼,而是從切換到主屏幕啓動器樣式應用程序開始進一步開始活動。

+0

任何人都可以確認上述是否適用於早期的API版本(例如 - Android 2.3),因爲我的接收器與上述設置完全相同,並且雖然類似的接收器工作正常,但飛行模式似乎完全不會被觸發,我不知道爲什麼。 – Haravikk 2014-01-14 18:10:26

5

這裏是接收器

public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().intern() == Intent.ACTION_AIRPLANE_MODE_CHANGED) { 
// Launch your app here 
}