2016-03-21 6 views
0

я пытаюсь создать файл директории для подключенного хранения USB я написал следующий код для создания реж:не удалось записать файл в хранилище USB

public class MainActivity extends AppCompatActivity { 

    private static final String ACTION_USB_PERMISSION = "com.example.usbtest.USB_PERMISSION"; 
    UsbManager mUsbManager; 
    UsbDevice device; 

    String s = null; 
    TextView tvusb; 

    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) { 
        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
         if (device != null) { 
          Toast.makeText(getApplicationContext(), "permission allowed" + device, Toast.LENGTH_LONG).show(); 
          //call method to set up device communication 
         } 
        } else { 
         Toast.makeText(getApplicationContext(), "permission not allowed" + device, Toast.LENGTH_LONG).show(); 
         Log.d("usb", "permission denied for device " + device); 
        } 
       } 
      } 
     } 
    }; 

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


     tvusb = (TextView) findViewById(R.id.tvusb); 

     mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 

     HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
     Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
     while (deviceIterator.hasNext()) { 
      device = deviceIterator.next(); 

      s = device.getDeviceName(); 

      int pid = device.getProductId(); 
      int vid = device.getVendorId(); 
      device = deviceList.get(s); 

      tvusb.setText(s + "\n" + Integer.toString(pid) + "\n" + Integer.toString(vid)); 
     } 


     PendingIntent mPermissionIntent; 


     mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 

     IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 


     registerReceiver(mUsbReceiver, filter); 

     mUsbManager.requestPermission(device, mPermissionIntent); 


     File fileContact = new File(s, "Contact"); 
     if (!fileContact.exists()) { 
      fileContact.mkdirs(); 
     } 

     if (!confirmDir(fileContact)) { 

      Toast.makeText(getApplicationContext(), "Unable to create " + String.valueOf(fileContact), Toast.LENGTH_LONG).show(); 

     } 

    } 

    private static boolean confirmDir(File dir) { 
     if (dir.isDirectory()) return true; // already exists 
     if (dir.exists()) return false;  // already exists, but is not a directory 
     return dir.mkdirs();     // create it 
    } 

} 

манифеста:

<manifest 

    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-permission android:name="android.permission.usb"></uses-permission> 

    <uses-feature android:name="android.hardware.usb.host"/> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

    <uses-feature android:name="android.hardware.usb.accessory"/> 

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <uses-library android:name="com.android.future.usb.accessory"/> 


     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <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_ACCESSORY_ATTACHED"/> 
      </intent-filter> 

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

     </activity> 

    </application> 

</manifest> 

Я также написал - Файл fileContact = новый файл («/ storage/emulated/0», «Contact»);

Но я не могу создать каталог в хранилище usb.

Как я могу создать каталог для хранения usb?

+0

Можете ли вы добавить файл манифеста? –

+0

Я приложил манифест. – deepak

+0

@LaurIvan, пожалуйста, проверьте мой файл манифеста. я думаю, что у него есть все необходимое разрешение для создания файла на USB-накопителе. – deepak

ответ

0

Как я понимаю, ваша проблема заключается в том, что вы хотите написать файл на внешнем хранилище. В этом случае вам понадобятся только разрешения *EXTERNAL*. По the documentation вам необходимо:

  • проверки, если носитель доступен для записи и чтения с чем-то вроде:

    /* Checks if external storage is available for read and write */ 
    public boolean isExternalStorageWritable() { 
        String state = Environment.getExternalStorageState(); 
        if (Environment.MEDIA_MOUNTED.equals(state)) { 
         return true; 
        } 
        return false; 
    } 
    

    (код дословной от источника)

  • Тогда вам необходимо использовать getExternalStoragePublicDirectory() или getExternalFilesDir() в зависимости от политики ваших файлов (открытых или закрытых для приложения).

Для доступа съемный носитель, вы должны использовать Storage Framework доступа, как указано в this SO post с ACTION_CREATE_DOCUMENT.

+0

Я подключил pendrive через кабель otg. поэтому я хочу создать файл на этом pendrive. С этим я получаю доступ только к своей внутренней памяти, а не к pendrive. – deepak