2016-10-21 5 views
6

Ich habe 2 Aktivitäten in meiner App. Sagen Sie FirstActivity und SecondActivity. FirstActivity ist die MAIN- und LAUNCHER-Aktivität. SecondActivity verwendet USB-Geräte. Ich möchte, dass die Eingabeaufforderung für die USB-Berechtigung nur einmal innerhalb der Laufzeit der App erscheint.USB-Berechtigungen ohne Aufforderung

Wenn es nur eine Aktivität war, die folgenden Zeilen in manifest gelöst mein Ziel:

<activity android:name=".FirstActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
     android:resource="@xml/usb_device_filter" /> 
</activity> 

Dies wurde wie folgt aktualisiert:

  1. Starten FirstActivity, wenn USB-Gerät (in xml erwähnt) ist Verbunden ist App ist noch nicht geöffnet.
  2. Eingabeaufforderung für USB-Gerät wird nur einmal angezeigt.

Wie modifiziere ich dies folgendes zu erreichen:

  1. Wenn SecondActivity bereits ausgeführt wird und ein neues USB-Gerät angeschlossen ist, ich muss in der Lage sein, das zu verwenden, Gerät ohne Neustart der App. So habe ich einen Rundfunkempfänger für das gleiche geschrieben wie folgt:

    public class TriggerReceiver extends BroadcastReceiver { 
    
        @Override 
        public void onReceive(Context context, Intent intent) { 
         if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { 
         read connected usb devices and register serial port call listener back. 
        } 
    }  
    

Aber das Problem ist FirstActivity wieder neu aufgelegt wird, wenn USB-Gerät angeschlossen wird, während SecondActivity läuft. Wie vermeide ich das?

Wird bei Bedarf weitere Informationen hinzufügen. Ich wäre dankbar für jede Hilfe.

Antwort

2

Versuchen in this Frage Intent-Filter <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> von FirstActivity wie

aktualisieren

FirstActivity löst bei jedem USB_DEVICE_ATTACHED (auch SecondActivity ausgeführt wird), weil Sie <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> es in AndroidManifest.xml Dateifilter setzen "entfernen". Sie sollten diesen Filter also deaktivieren, wenn SecondActivity ausgeführt wird. Sie können durch diese Art und Weise dies tun:

1) hinzuzufügen (zB AliasFirstActivity) in AndroidManifest.xml zu Ihrem FirstActivity und <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> Filter alias Beschreibung bewegen (Sie <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> aus FirstActivity Beschreibung entfernen sollten) wie folgt aus:

 <activity-alias 
      android:targetActivity=".FirstActivity" 
      android:name=".AliasFirstActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
      </intent-filter> 

      <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
         android:resource="@xml/device_filter" /> 
     </activity-alias> 

2) in dem Code zu onCreate() (oder zu onResume()) von SecondActivity

PackageManager pm = getApplicationContext().getPackageManager(); 
     ComponentName compName = 
       new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity"); 
     pm.setComponentEnabledSetting(
       compName, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 

Vorsatz f zu unterdrücken, Filter USB_DEVICE_ATTACHED für FirstActivity. Sie sollten in SecondActivity so etwas haben:

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

     triggerReceiver = new TriggerReceiver(); 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
     registerReceiver(triggerReceiver, filter); 

     PackageManager pm = getApplicationContext().getPackageManager(); 
     ComponentName compName = 
       new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity"); 
     pm.setComponentEnabledSetting(
       compName, 
       PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
       PackageManager.DONT_KILL_APP); 
    } 

, die Ihr Problem lösen sollte. 3), wenn es erforderlich ist, Sie <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> Filter für FirstActivity in onDestroy() (oder in onPause()) von SecondActivity mithilfe dieses Code wiederherstellen:

PackageManager pm = getApplicationContext().getPackageManager(); 
    ComponentName compName = 
      new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity"); 
    pm.setComponentEnabledSetting(
      compName, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
+1

ich nicht diese vollständig zu verstehen. Wenn ich einen Alias ​​mit dem erforderlichen Aktivitätsfilter erstelle, würden nachfolgende App-Launches erneut um eine USB-Erlaubnis bitten? Auch in diesem Fall, wo erwähnt das Meta-Tag? Können Sie bitte den Aktivitäts-Alias-Code hinzufügen, an den Sie denken? Es wäre eine große Hilfe. – jay

+0

Bitte lesen Sie die Updates auf meiner Antwort. –

1

Aber das Problem ist FirstActivity neu aufgelegt wird wieder, wenn USB-Gerät angebracht, während SecondActivity läuft. Wie vermeide ich das?

Dies ist nicht schwer zu beantworten. In Ihrer AndroidManifest.xml erklären Sie wörtlich, dass Ihre FirstActivity gestartet werden sollte, wenn das Ereignis android.hardware.usb.action.USB_DEVICE_ATTACHED auftritt.

Wenn Sie dieses Ereignis in SecondActivity nur handhaben möchten, dann haben Sie es im Manifest entsprechend zu erklären, zum Beispiel:

<activity android:name=".FirstActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".SecondActivity" android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
      android:resource="@xml/device_filter" /> 
    </activity> 

Nun, wenn das USB-Gerät eingesteckt ist, wird SecondActivity gestartet nur. Wenn SecondActivitybereits ausgeführt wird, wird es aufgrund des Attributs android:launchMode="singleTask", das für SecondActivity angegeben wird, nicht erneut gestartet (oder mehrere Male). Sie können mehr über die verschiedenen Startmodi lesen here, wenn Sie interessiert sind.

Da Sie in Ihrem Manifest erklärt, dass SecondActivity gestartet werden soll, wenn ein USB-Gerät angeschlossen ist, das Android-System fragt Sie die folgende Frage:

USB Dialog

Nachdem Sie die Checkbox „standardmäßig tickt für dieses USB-Gerät "wird es Sie nicht erneut fragen. Jedes Mal, wenn Sie das USB-Gerät anschließen, wird Ihr SecondActivity gestartet und erhält automatisch die erforderlichen USB-Berechtigungen.

Lassen Sie mich wissen, ob das Ihre Frage beantwortet.

0

Auch diese Antwort helfen Sie: USB device access pop-up supression?

Aus dieser Antwort für Ihre Aktivität:

public class UsbEventReceiverActivity extends Activity 
{ 
    public static final String ACTION_USB_DEVICE_ATTACHED = "com.example.ACTION_USB_DEVICE_ATTACHED"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 

@Override 
protected void onResume() 
{ 
    super.onResume(); 

    Intent intent = getIntent(); 
    if (intent != null) 
    { 
     if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) 
     { 
      Parcelable usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

      // Create a new intent and put the usb device in as an extra 
      Intent broadcastIntent = new Intent(ACTION_USB_DEVICE_ATTACHED); 
      broadcastIntent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice); 

      // Broadcast this event so we can receive it 
      sendBroadcast(broadcastIntent); 
     } 
    } 

    // Close the activity 
    finish(); 
} 

}

Verwandte Themen