2017-01-11 11 views
0

PTPを使用しているカメラのファイルをタブレットにコピーしようとしています。私はアンドロイドAPI MTPDevice (https://developer.android.com/reference/android/mtp/MtpDevice.html#importFile%28int,%20java.lang.String%29)を使用しています。私は必要な許可(android.mtp.MtpClient.action.USB_PERMISSION)を要求しています。Mtp/Ptp Android

私はデバイスを開いて、関数はtrueを返し、USBConnection(Connexion OK)を開きます。

私は、タブレットの一時フォルダ(/ mnt/sdcard/tmpFolder)にカメラのすべてのファイルをインポートしようとしています。パスは私のタブレット上に存在するが、私はimportFiles関数にそれを与えるとき、私はエラーがあります:私は、私がメッセージを持って存在しないパスを試してみる

[LOGCAT]

MtpDevice: readObject: /mnt/sdcard/tmpFolder 
MtpDevice: open failed for /mnt/sdcard/tmpFolder 
Debug: File import KO 

を:

[LOGCAT]

MtpDevice: readObject: /mnt/sdcard/tptp 
MtpDevice: readResponse failed 
Debug: File import KO 

誰かが私を助けることができますか?

ソリューションは、(githubの上で発見される):同じ問題を抱えている人々のため

おかげ

@Background 
@DebugLog 
public void getMTPDevice() { 
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
    if (deviceIterator.hasNext()) { 
     UsbDevice usbDevice = deviceIterator.next(); 
     device = openDeviceLocked(usbDevice); 
     if(device!=null){ 
       File folder = returnTempFolderCamera(); 
       if(folder.exists()){ 
        Log.d("Debug", "Folder exist /mnt/sdcard/tmpFolder"); 
        if(device.importFile(0,folder.getPath())) 
        { 
         Toast.makeText(this, "File import OK", Toast.LENGTH_LONG).show(); 
         Log.d("Debug", "Files import OK"); 
        }else { 
         Toast.makeText(this, "File import KO", Toast.LENGTH_LONG).show(); 
         Log.d("Debug", "Files import KO"); 
        } 
       } 
     } 
    } 
}/** 
* Opens the {@link android.hardware.usb.UsbDevice} for an MTP or PTP device 
* and return an {@link android.mtp.MtpDevice} for it. 
* 
* @param usbDevice 
*   the device to open 
* @return an MtpDevice for the device. 
*/ 
@DebugLog 
private MtpDevice openDeviceLocked(UsbDevice usbDevice) { 
    String deviceName = usbDevice.getDeviceName(); 
    byte[] data = new byte[128]; 
    int TIMEOUT = 0; 
    boolean forceClaim = true; 
    // don't try to open devices that we have decided to ignore 
    // or are currently asking permission for 
    if (isCamera(usbDevice) 
      && !mRequestPermissionDevices.contains(deviceName)) { 
     if (!manager.hasPermission(usbDevice)) { 
      manager.requestPermission(usbDevice, mPermissionIntent); 
      mRequestPermissionDevices.add(deviceName); 
     } else { 
      UsbInterface intf = usbDevice.getInterface(0); 
      UsbEndpoint endpoint = intf.getEndpoint(0); 
      UsbDeviceConnection connection = manager.openDevice(usbDevice); 
      connection.claimInterface(intf, forceClaim); 
      connection.bulkTransfer(endpoint, data, data.length, TIMEOUT); 
      if (connection != null) { 
       MtpDevice mtpDevice = new MtpDevice(usbDevice); 
       if (mtpDevice.open(connection)) { 
        mDevices.put(usbDevice.getDeviceName(), mtpDevice); 
        return mtpDevice; 
       } 
      } 
     } 
    } 
    return null; 
} 
     private File returnTempFolder(){ 
      File tmp = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/tmpFolder"); 
      return tmp; 
     } 
+0

'必要な要求を持っています許可、およびマニフェストに書いてください。それはどれでしょうか?残りの部分については、どのパスのメッセージを正確かつ正確にいつどこで表示するかははっきりしていません。 – greenapps

+0

'createTempFolderCamera()'間違った関数名は、フォルダを作成せず、フォルダのFileオブジェクトのみを返すためです。 – greenapps

+0

'Log.d(" Debug "、" File exists ");'。あなたは「存在する」という意味ですか? – greenapps

答えて

0

MtpClient(https://android.googlesource.com/platform/packages/apps/Gallery2/+/jb-dev/src/com/android/gallery3d/data/MtpClient.java

@Background 
@DebugLog 
public void importFiles() { 
    MtpClient mtpClient = new MtpClient(this); 
    mtpClient.getDeviceList(); 
    for (int i = 0; i < mtpClient.getDeviceList().size(); i++) { 
     int[] tab = mtpClient.getDeviceList().get(i).getObjectHandles(mtpClient.getDeviceList().get(i).getStorageIds()[0], 0, 0); 
     for (int j = 0; j < tab.length; j++) { 
      File dest = Environment.getExternalStorageDirectory(); 
      // NAME_IMPORTED_FOLDER = tmpFolder 
      dest = new File(dest, NAME_IMPORTED_FOLDER); 
      dest.mkdirs(); 
      MtpObjectInfo objInfo = mtpClient.getDeviceList().get(i).getObjectInfo(tab[j]); 
      if (objInfo != null) { 
       String destPath = new File(dest, objInfo.getName()).getAbsolutePath(); 
       int objectId = objInfo.getObjectHandle(); 
       // Succes !! 
       boolean result = mtpClient.getDeviceList().get(i).importFile(objectId, destPath); 
      } 
     } 
    } 
    mtpClient.close(); 
} 
関連する問題