You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取Windows连接安卓手机的文件夹路径及Java访问其文件系统方案

问题1:如何获取与Windows电脑连接的安卓手机上的文件夹路径?

首先得明确:当安卓手机以**MTP(媒体传输协议)**模式连接Windows时,它并不是被挂载成一个普通的磁盘盘符(比如D:\、E:\),而是作为一个媒体设备存在,所以你没法拿到像本地磁盘那样的常规文件路径(比如C:\Users\XXX\Documents这种格式)。

不过有几种实用的方式可以获取/操作手机里的文件夹:

  • 手动查看的话:打开「此电脑」,找到你的安卓设备名称,双击进入后导航到目标文件夹,此时地址栏显示的是类似此电脑\XXX的手机\内部存储\DCIM这样的虚拟路径,但这个路径没法直接被Java的File类识别。
  • 通过ADB命令获取:如果你开启了手机的USB调试,可以用ADB命令直接访问手机的真实文件系统路径,比如执行adb shell ls /sdcard/DCIM就能列出内部存储里DCIM文件夹的内容,这里的/sdcard/DCIM就是手机内部的标准文件路径。

问题2:Java能否通过USB访问连接到Windows电脑的安卓手机文件系统?

答案是可以,但因为默认的MTP模式不被Java标准库的文件API识别(这就是为什么JFileChooserFile.listRoots()看不到它的原因),所以需要用一些特殊方法:

方法1:通过ADB命令间接操作

这是最容易实现的方式,不需要复杂的JNI或者原生API调用。你可以在Java代码里通过ProcessBuilder执行ADB命令,来实现文件的读取、写入、列表查看等操作。

举个简单的例子,Java代码执行ADB命令获取手机文件夹内容:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class AdbFileAccess {
    public static void main(String[] args) {
        try {
            // 执行adb命令列出手机DCIM文件夹内容
            Process process = new ProcessBuilder("adb", "shell", "ls", "/sdcard/DCIM").start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这种方式的前提是你的电脑已经配置好ADB环境,并且手机开启了USB调试模式。

方法2:通过JNI调用Windows的WPD API

如果不想依赖ADB,你可以通过JNI调用Windows的便携式设备(WPD)API——因为MTP是基于WPD实现的,原生Windows API可以直接访问MTP设备的文件系统。

你需要做的是:

  • 了解WPD的核心接口,比如IPortableDeviceManager(枚举连接的设备)、IPortableDevice(连接设备)、IPortableDeviceContent(获取设备内容)等。
  • 用C/C++编写调用这些API的原生代码,然后通过JNI封装成Java可以调用的方法。
  • 在Java代码里加载原生库,调用对应的方法来访问手机文件。

这种方式灵活性更高,但需要你具备Windows原生开发的基础。

方法3:使用第三方Java MTP库

有些第三方库已经封装了WPD API或者MTP协议的调用逻辑,你可以直接在Java项目中引入这类库,不用自己写JNI代码就能实现MTP设备的文件访问。这类库会帮你处理底层的协议细节,你只需要调用它提供的API即可。


内容的提问来源于stack exchange,提问作者mediocre man

火山引擎 最新活动