Как получить доступ к внешнему USB-накопителю через плагин Cordova File в Ionic? - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение на Ionic, в которое хочу добавить функциональность чтения файлов с внешних устройств хранения данных, подключенных к мобильному телефону через micro USB (на устройствах Android) или Lightning (на iPhone).

После исследования об этом; Я не нашел что-то, что уже собрано, кроме плагина File , который имеет отличный API для доступа для чтения / записи на самом мобильном телефоне и sdcard, который монтируется на устройстве, но я не сделал удалось прочитать флэш-накопитель USB, подключенный к мобильному телефону.

В данный момент я тестирую на устройстве Android с кодом ниже

import {Injectable} from '@angular/core';
import {File} from "@ionic-native/file";
@Injectable()
export class MyClassProvider {

  constructor(public fileNative: File) {}

  public findPathOfMainUSBFolder() {
    let fs = this.fileNative;
    let folders = [fs.applicationDirectory, fs.applicationStorageDirectory, fs.cacheDirectory, fs.dataDirectory, fs.externalRootDirectory, fs.externalApplicationStorageDirectory, fs.externalCacheDirectory, fs.externalDataDirectory, "file:///storage/"];

    for (let mainFolder of folders) {
      this.fileNative.listDir(mainFolder,'').then( success => {
        console.log("success ", mainFolder, "Contents: ", success);
      }, rej => {
        console.log("rej ", mainFolder, "Contents: ", rej);
      }).catch(err => {
        console.log("err ", mainFolder, "Contents: ", err);
      })
    }
  }
}

перебирает все доступные каталоги , чтобы увидеть, будет ли в нем содержимое флэш-памяти USB. Ни один из этих каталогов не указывает на / является корневым каталогом на USB.

Я что-то упустил или просто невозможно использовать плагин File для доступа к флешке?

1 Ответ

0 голосов
/ 30 августа 2018

После некоторых копаний в файловой системе и использования File Chooser , который помог мне определить полный путь к файлам на USB, я в итоге получил следующую функцию, которая создает массив, содержащий один объект для каждого Подключено устройство USB с указанием пути USB:

public findPathOfMainUSBFolder(callback) {

    let usbDevicesConnected = [];
    this.fileNative.listDir("file:///", "storage").then( success => {
      for (let entry of success) {
        if (entry.isDirectory == true && entry.name != "emulated" && entry.name != "self") {
          usbDevicesConnected.push({path: "file:///storage/", dirName: entry.name});
          console.log("USB ", entry.name, " has been added to the list");
        }
      }
      callback(usbDevicesConnected)
    }, rej => {
      console.log("rej file:///, storage ", "Contents: ", rej);
    }).catch(err => {
      console.log("err file:///, storage ", "Contents: ", err);
    })

}

, который можно вызвать, как показано ниже, чтобы перечислить все файлы, которые существуют на корневом уровне USB:

this.findPathOfMainUSBFolder( usbArray => {
  for (let usb of usbArray) {
    this.fileNative.listDir(usb.path, usb.dirName).then( success => {
      console.log("USB with ID " + usb.dirName + " has contents: ", success)
    }, rej => {
      console.log("REJ on USB with ID " + usb.dirName + " : ", rej)
    }).catch(err => {
      console.log("ERr on USB with ID " + usb.dirName + " : ", err)
    })
  }
})

Это работает на мобильных телефонах Android, но я не тестировал его на iPhone.

...