2013-03-06 22 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 
}