2014-03-05 55 views
2

我上它採用USB accessory.When附上設備的Arduino它要求USB許可,它在對話框中的「默認情況下使用」。當我選中的複選框,然後按OK然後將其應用工作應該保存權限,不要再問我,但每次我連接USB時都會詢問權限。我想保存權限是否有任何方法可以保存?刪除USB配件權限對話框

我的代碼loooks像

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

    if (mInputStream != null && mOutputStream != null) { 
     // streams were not null"); 
     return; 
    } 
    // streams were null"); 
    UsbAccessory[] accessories = mUsbManager.getAccessoryList(); 
    UsbAccessory accessory = (accessories == null ? null : accessories[0]); 
    if (accessory != null) { 
     if (mUsbManager.hasPermission(accessory)) { 
      openAccessory(accessory); 
     } else { 
      synchronized (mUsbReceiver) { 
       if (!mPermissionRequestPending) { 
        mUsbManager.requestPermission(accessory, 
          mPermissionIntent); 
        mPermissionRequestPending = true; 
       } 
      } 
     } 
    } 

和Android清單文件看起來

<activity 
     android:name="pkg.sarvajal.soochakdroid.Main" 
     android:label="@string/Home" 
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" 
     android:screenOrientation="landscape"> 
     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> 
     </intent-filter> 


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

附件過濾器類似於

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<usb-accessory manufacturer="Manufacturer" model="Model" version="1.0" /> 
<usb-device vendor-id="0x0403" product-id="0x0403" /> 
</resources> 

我的廣播接收器代碼

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (ACTION_USB_PERMISSION.equals(action)) { 
      synchronized (this) { 
       //UsbAccessory accessory = UsbManager.getAccessory(intent); 
       UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 
       if (intent.getBooleanExtra(
         UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        Flag_USB_Attached = true; 
        Flag_Count_USB_Attached = 0; 
        Flag_Count_USB_Restart_App = 0; 
        openAccessory(accessory); 
        String strdatetime =responce_date(); 
        //sendSMS_background(phoneNumber, "USB Cable Connected at "+strdatetime); 


       } else { 
        // USB permission denied 
       } 
      } 
     } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { 
      //UsbAccessory accessory = UsbManager.getAccessory(intent); 
      UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 
      if (accessory != null && accessory.equals(mAccessory)) { 
       // accessory detached 
       Flag_USB_Attached = false; 
       Flag_Count_USB_Attached = 0; 
       closeAccessory(); 
       String strdatetime =responce_date(); 
       //sendSMS_background(phoneNumber, "Communication Stopped! \n USB Cable Disconnected at "+strdatetime); 
       //SMS_USB(); 

      } 
     } 
} 

而且Settingup附件代碼

/ Setting up accessory 
private void setupAccessory() { 
    //mUsbManager = UsbManager.getInstance(this); 
    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
      ACTION_USB_PERMISSION), 0); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); 
    registerReceiver(mUsbReceiver, filter); 
    if (getLastNonConfigurationInstance() != null) { 
     mAccessory = (UsbAccessory) getLastNonConfigurationInstance(); 
     openAccessory(mAccessory); 
    } 
} 
// Opening Accessory Mode 
private void openAccessory(UsbAccessory accessory) { 
    mFileDescriptor = mUsbManager.openAccessory(accessory); 
    if (mFileDescriptor != null) { 
     mAccessory = accessory; 
     FileDescriptor fd = mFileDescriptor.getFileDescriptor(); 
     mInputStream = new FileInputStream(fd); 
     mOutputStream = new FileOutputStream(fd); 
     Thread thread = new Thread(null, this, "OpenAccessoryTest"); 
     thread.start(); 
     // Accessory opened 
    } else { 
     // failed to open accessory 
    } 
} 
// close Accessory 
private void closeAccessory() { 
    try { 
     // T.cancel(); 
     if (mFileDescriptor != null) { 
      mFileDescriptor.close(); 
     } 
    } catch (IOException e) { 
    } finally { 
     mFileDescriptor = null; 
     mAccessory = null; 
    } 
} 
+0

您可以使用本機的共享偏好,但我不知道,除非我明白你的問題完全。所以給我你的代碼或代碼的屏幕截圖的一些片斷。 –

+0

@Balaji Sabdhar M I已編輯我的代碼 – ashokk

回答

1

按照Android USB host documentation,你的應用程序有權限,直到設備斷開訪問設備。 This question提供了一個禁止權限對話框的解決方案。在清單文件中創建一個意圖過濾器,並在xml文件中提供設備信息。這將啓用使用廣播接收器來枚舉設備。

另一參考文獻是this question。後者是爲了根植設備,我沒有親自嘗試過。

編輯:

清單文件:註冊我的廣播接收器清單文件。

<receiver android:name="MyReceiver"> 
       <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" /> 
</receiver> 

爲了方便起見,我有我的廣播接收器在一個單獨的類:

public class PmrtReceiver extends BroadcastReceiver { 


public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 
     if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)){ 

      Toast.makeText(context, "Device Detected",Toast.LENGTH_LONG).show(); 


     } else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){ 

      Toast.makeText(context, "Device Detached",Toast.LENGTH_LONG).show(); 

     } 

    } 

}; 

我沒有做任何事情都要以抑制許可對話框。

看到從Android樣品的USB導彈發射器的例子。你的設備過濾應該是這樣的:

<?xml version="1.0" encoding="utf-8"?> 

<resources> 
    <usb-device vendor-id="1234" product-id="5678" /> 
</resources> 

你有VID和PID作爲十六進制數字。

+0

的問題,我也做了同樣的編碼,但沒有運氣 – ashokk

+0

我已經編輯我的代碼片段 – ashokk

+0

問題,你可以分享附件過濾器? – Sai