-->

的Nexus 4不表示经由MTP文件(Nexus 4 not showing files via M

2019-06-21 16:28发布

我想简单地写一个简单的XML文件到SD卡上,我发现我的Nexus 4也写入文件,但它不是通过使用Windows 7的MTP协议可见。

码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    CustomerQueryRqType customerQueryRequest = new CustomerQueryRqType();
    Serializer serializer = new Persister();
    File myFile = new File(Environment.getExternalStorageDirectory() + "/customerQueryRequest.xml");

    try {
        boolean created = myFile.createNewFile();
        serializer.write(customerQueryRequest, myFile);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我可以看到手机本身带有天文文件管理器上的文件:

但Windows不会看到它... ...:

adb shell上的目录显示:

ls -l
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Alarms
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Android
drwxrwxr-x root     sdcard_rw          2012-11-21 19:30 DCIM
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Download
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Movies
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Music
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Notifications
drwxrwxr-x root     sdcard_rw          2012-11-19 12:06 Pictures
drwxrwxr-x root     sdcard_rw          1970-01-16 20:51 Podcasts
drwxrwxr-x root     sdcard_rw          2012-11-19 13:22 Ringtones
drwxrwxr-x root     sdcard_rw          2012-11-19 14:33 bluetooth
-rw-rw-r-- root     sdcard_rw       79 2012-12-05 22:26 customerQueryRequest.xml
drwxrwxr-x root     sdcard_rw          2012-11-20 02:50 data
-rw-rw-r-- root     sdcard_rw    11394 2012-11-19 13:54 eightpen_custom_gestures
drwxrwxr-x root     sdcard_rw          2012-11-19 13:17 media

这是怎么回事我的Nexus 4? 为什么躲在我的东西从Windows?

Answer 1:

似乎是一个影响了MTP的Android USB文件访问已知的问题 。 该MTP缓存变得过时,直到手机重启。

一个解决办法是:

  • 清除“媒体存储”应用程序的数据
  • 使用SDrescan或SD扫描仪 (也适用于Android 4.4 / 5,可在F-的Droid )应用强制更新

或者只是避免使用USB可言。 该问题不会影响访问文件的其他方法。 例如,尝试AirDroid传输文件。


注意:这并不适用于Android 5.0.2工作:清除“媒体存储”,并使用SD Rescanner后,文件夹显示在Windows 7不能打开4K文件。 在这一点上唯一的解决办法就是再次明确媒体存储和重新启动设备



Answer 2:

您可以文件关闭后使用下面的代码

MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);

来源: https://code.google.com/p/android/issues/detail?id=38282



Answer 3:

在这个问题上花了几个小时后,我解决了这样的:

private void rescanFolder(String dest) {
    // Scan files only (not folders);
    File[] files = new File(dest).listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isFile();
        }
    });

    String[] paths = new String[files.length];
    for (int co=0; co< files.length; co++)
        paths[co] = files[co].getAbsolutePath();

    MediaScannerConnection.scanFile(activity, paths, null, null);

    // and now recursively scan subfolders
    files = new File(dest).listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    });

    for (int co=0; co<files.length; co++)
        rescanFolder(files[co].getAbsolutePath());
} 

问题是,你必须 (不是文件夹)扫描文件 ,然后递归地重复每个fubfolder

编辑此外,如果你不希望照片被添加到您的相册(只是你的内容出现在MTP协议),记得要放在一个空.nomedia您的文件夹中的文件重新扫描它,就像在此之前:

new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);


Answer 4:

上的Xperia Z ^下面的代码工作得很好:

  String screenShotFile = "....";
  activity.sendBroadcast(new Intent(
        Intent.ACTION_MEDIA_MOUNTED, Uri
                .fromFile(screenShotFile)));

为4.4+使用:

activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                                Uri.fromFile(screenShotFile)));

(unfortunalelly我不记得我是否已经测试的不够好)

http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html



Answer 5:

通知/存储/效仿。 的Android 4.2有一些时髦的仿真每个应用/用户访问东西事情,例如一个独立的/ SD卡/为每个用户。 尝试将文件移动到所显示/ SD卡/代替模拟SD卡。



Answer 6:

提出的简单的代码来问我怎么能刷新MediaStore在Android? 确实MediaStore的必要更新,如果叫我把文件放在外部存储之后。 在我的Nexus 4的内容是微软Windows 7文件浏览器立即刷新。



Answer 7:

我需要创建一个目录,拷贝一些示例文件我的应用程序。 经过大量的实验和研究下面的过程完美地工作对我来说:

1)使用File.mkdir创建的目录()。

2)复制的目录中的文件,并在每个文件运行MediaScanner。

MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);

3)运行MediaScanner上目录。

MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);

结果:文件和目录瞬间出现在PC上MTP。



Answer 8:

与我OneplusOne一个类似的问题:

软件更新(6.0.1)后,我没能看到我的相机内的照片连接到计算机(PTP和MTP)时。 这两个应用程序的SDRescan和SDscanner没有效果。

我的解决办法是从DCIM的所有照片复制到使用终端或电话上的任何文件资源管理器应用程序的另一个文件夹。 当连接到电脑我能看到复制的文件..我他们移动到我的电脑并清除我的相机文件夹中。 没有永久的解决方案,但它解决了这一问题,至少对我来说,直到我做一个备份。 = d



Answer 9:

我发现,在提到的错误最好的解决方法接受的答案是将数据从Android操作系统复制到使用SSH的一个又一个机/服务器(Linux的,MacOS的,窗户)。

  • 确保设备(Android)和机器(要复制的数据)每个IP或主机名访问,例如通过将它们连接到同一个WiFi网络。

可选和建议

  • 连接使用USB数据连线的Android设备。 这保证,因为有线连接的速度快,保证了两个IP地址都是可见的对方,因为两者是同一个网络。

在Android设备

  • 安装SSH服务器。 SSHelper工作就像一个魅力
  • 运行SSHelper并转到配置选项卡来获得IP地址,端口和密码。 在下面的例子中,它们是192.168.1.5,2222和“管理员”。
  • 默认密码是admin,但如果你决定改变它改变它后点击按钮“用新值重新启动服务器”

在机

  • 安装rsync的。 如果碰巧使用Ubuntu的它已经被默认安装。
  • 打开shell并输入以下命令。 更改IP地址和端口,以你的价值观

rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/

  • 你会得到下面的提示,输入您的密码

SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) username@192.168.1.5's password: admin receiving incremental file list

其他建议并没有为我工作:

  • 使用USB存储模式,而不是MTP不是由设备(如其他许多较新的设备)的支持。
  • 有在我的OS(安卓6.0.1)没有选项以清除“媒体存储”应用程序数据。
  • 通过网络共享文件的其它方法有他们的平局背上。 FTP不保证文件的完整性。 如果连接被丢弃,要么覆盖或跳过所有文件,所以文件中的一个可能是不完整的。 其他协议可能很难安装和其他应用程序可能使用的专有协议。


Answer 10:

以上答案是罚款创建文件。 如果以后删除该文件,并希望这样的变化中反映出来为好,你可以做以下的一个; 让我们首先包括两级方面的解决方案,似乎是他们的工作,但会造成在某些设备上的问题。 第一个是扫描删除的文件:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

这部作品已删除的文件很多设备,但在某些设备上它实际上将导致创建一个新的0字节的文件,这可能不是你想要的。 在这种情况下,如果你在<4.4奇巧运行,你可以这样做:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));

当文件夹等于file.getParentFile()。 不幸的是,奇巧4.4及以上,这将导致一个SecurityException得到抛出,所以对于这些设备,您可以尝试直接从媒体商店中删除:

final Uri externalFilesUri = Files.getContentUri("external");
context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});

我测试过这一个作为ACTION_MEDIA_MOUNTED不工作的奇巧一种变通方法,和它的作品在我的测试将应用于Nexus 5。



Answer 11:

最近,我面临着同样的问题,但一些额外的研究有助于找到隐藏的文件。 看来,谷歌已经在存储结构的一些变化。 所有这些文件都移动到另一个文件夹, This Computer\HTC One\Internal Storage\storage\emulated\0 。 但它奇怪的是,并不是所有的文件被移动。

是Android 4.4.2



Answer 12:

从文档在这里 ,你需要调用MediaScannerConnection.scanFile:

// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
        new String[] { file.toString() }, null,
        new MediaScannerConnection.OnScanCompletedListener() {
    public void onScanCompleted(String path, Uri uri) {
        Log.i("ExternalStorage", "Scanned " + path + ":");
        Log.i("ExternalStorage", "-> uri=" + uri);
    }
});


文章来源: Nexus 4 not showing files via MTP