2013-03-06 3 views
4

Я работаю над разработкой приложения для Android, которое будет использоваться в качестве карманного контроллера в промышленной среде. Чтобы сделать планшет менее желательным, чтобы вернуться домой, я собирался все время программировать в режиме Airplane Mode, но это было устаревшим в 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> 

также найдены как aswer по saxos here.

Теперь ни одно из этих решений не запускает мое приложение при изменении режима полета.

Возможно ли зарегистрировать BroadcaseReceiver для режима полета в файле манифеста и запустить ли это приложение?

Редактировать 1: У меня есть BroadcastReceiver, работающий в Java-коде, чтобы я мог обнаружить эту ситуацию, пока мое приложение активно. Это не то, что я ищу, хотя. Благодарю.

Edit 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 ATTACHED и MAIN пусковая работа просто отлично и начать мое приложение из onCreate точки. Однако AIRPLANE_MODE, похоже, ничего не делает.

А вот мой BroadcastReceiver, что находится в пределах кода 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

да его возможное использование <действие android: name = "android.intent.action.AIRPLANE_MODE" /> – DjHacktorReborn

+0

@DjHacktorReborn Нужно ли иметь теги 'uses-permission '? Благодарю. – TronicZomB

+0

nopes вам не нужно – DjHacktorReborn

ответ

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> 

А затем создать класс Java файл с именем AirplaneModeReceiver и поместите в него:

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

5

Вот фрагмент кода для приемника

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