我正在开展一个项目,需要通过USB线将智能手机连接到平板电脑。要从平板电脑访问智能手机中的文件,我使用Android的Intent.ACTION_GET_CONTENT
来检索文件。我是,更具体地说是试图打开图片。
我知道这是可能的,因为当我点击描述智能手机的通知时,它会打开一个带有智能手机基本文件夹的默认Android应用程序。
我想要实现的是直接打开连接的智能手机存储,而不必从平板电脑切换到存储设备到智能手机。
我知道如何获取智能手机的音量名称,但这并没有帮助我取得进步。我检查了从意图收到的Uri,它类似于content://com.android.mtp.documents/document/951
或content://com.android.mtp.documents/tree/1021
。
我曾尝试使用Uri来打开所需的文件夹,但它不起作用。
我尝试了新的StorageManager
API但没有成功。
最近,我更专注于尝试从我的应用程序中简单地访问文件,但使用上面提到的Uri或mount文件夹(/dev/bus/usb/001/002/
)却什么都没有。
我也尝试了Environment.MEDIA_MOUNTED
但没有成功。
我目前的代码是这样的: 请求使用智能手机的许可:
final UsbManager manager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
if (deviceList.size() > 0) {//TODO switch to 1 on USBCameraFragment
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
UsbDevice device = (UsbDevice) deviceList.values().toArray()[0];
manager.requestPermission(device, mPermissionIntent);
} else {
Toast.makeText(getContext(), "Please connect your device to the tablet.", Toast.LENGTH_SHORT).show();
}
打开连接并启动意图:
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if(device != null){
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
Uri path = MediaStore.Files.getContentUri(device.getProductName());
//Uri path = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.MEDIA_MOUNTED).getAbsolutePath());
i.setDataAndType(path, "image/*");
i.addCategory(Intent.CATEGORY_OPENABLE);
MtpDevice mtpDevice = new MtpDevice(device);
UsbDeviceConnection conn = ((UsbManager) getActivity().getSystemService(Context.USB_SERVICE)).openDevice(device);
mtpDevice.open(conn);
//1.5s to make sure I have allowed the MTP connection on the smartphone.
try{Thread.sleep(1500);}catch(InterruptedException e){}
startActivityForResult(i, Constants.PICKFILE_REQUEST_CODE);
}
}
else {
Log.d(TAG, "permission denied for device: " + device);
}
}
}
}
};