2014-03-05 2 views
2

USB 액세서리를 사용하는 응용 프로그램에서 작업하고 있습니다. arduino에 장치를 연결하면 usb 권한을 묻는 메시지가 표시되고 "기본적으로 사용"대화 상자에 확인란이 있습니다. 확인한 후 확인을 누르면 권한을 저장하고 다시 묻지는 않으나 USB를 연결할 때마다 권한을 요청합니다. 권한을 저장하고 싶습니다.이를 저장하는 방법이 있습니까?USB 액세서리 권한 대화 상자 제거

@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; 
       } 
      } 
     } 
    } 

그리고 안드로이드 매니페스트 파일과 같은

내 코드 loooks는

<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 코드로 내 질문을 편집했습니다 – ashokk

답변

1

Android USB host documentation에 따르면, 응용 프로그램이 장치의 연결이 끊어 때까지 장치에 액세스 할 수있는 권한이있다. This question은 권한 대화 상자를 표시하지 않는 솔루션을 제공합니다. 매니페스트 파일에 인 텐트 필터를 만들고 xml 파일에 장치 정보를 제공하십시오. 이것은 브로드 캐스트 수신기를 사용하여 장치를 열거 할 수있게합니다.

또 다른 참조 번호는 this question입니다. 후자는 루팅 된 장치를위한 것이며 개인적으로 시도하지 않았습니다.

편집 :

매니페스트 파일 : 나는 매니페스트 파일 내 방송 수신기를 등록합니다.

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(); 

     } 

    } 

}; 

내가 권한 대화 상자를 억제하는 다른 작업을 수행하지 않았다 편의를 위해서

<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> 

, 나는 별도의 클래스 내 방송 수신기가 있습니다.

Android 샘플에서 USB Missile Launcher 예제를 살펴보십시오. 장치 filtr은 다음과 같아야합니다.

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

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

VID와 PID는 16 진수로 표시됩니다.

+0

동일한 코딩을했지만 행운이 없었습니다 – ashokk

+0

코드 스 니펫으로 내 질문을 편집했습니다 – ashokk

+0

액세서리 필터를 공유 할 수 있습니까? – Sai

관련 문제