这开始是Android论坛上的一般用户问题.然而,它必然是一个编程问题.这是我的问题.
Android有一项服务 - MediaScanner - 它可以随时在后台运行(我相信)SD卡已卸载并重新安装.此服务收集卡上所有媒体文件的数据,并提供可由音乐应用程序查询的SQLite DB.大多数音乐应用程序都使用此服务,因为它可以节省与扫描SD卡相关的电量消耗.
自从我开始使用android以来,我一直遇到一个问题,即即使从SD卡中删除后,与该设备同步的M3U播放列表仍保留在此SQLite DB中.虽然卡上只有大约10个m3u的文件,但我现在已经收集了大约40个播放列表,这些播放列表出现在我使用的任何音乐应用程序中.剩余的播放列表不播放,并且是空的.我可以通过从音乐应用程序中删除它们来手动删除它们,但我厌倦了这样做.必须有更好的方法来删除这些鬼播放列表.
Android Market上有两个应用程序 - SDRescan和Music Scanner,据说可以做到这一点,但它们都不起作用.
我开始编写自己的应用程序来刷新或删除MediaStore数据库并从头开始,但我没有走得太远.我有一个运行以下代码的Android应用程序:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Run Code Online (Sandbox Code Playgroud)
我在网上找到了一些这样的代码扫描SD卡的方法,但我没有任何运气.有小费吗?
完整代码:
package com.roryok.MediaRescan;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
public class MediaRescan extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
setContentView(R.layout.main);
}
//Rescan the sdcard after copy the file
private void rescanSdcard() throws Exception{
Intent scanIntent = …Run Code Online (Sandbox Code Playgroud) 我上了这堂课:
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.util.Log;
public class MediaScannerWrapper implements
MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection mConnection;
private String mPath;
private String mMimeType;
// filePath - where to scan;
// mime type of media to scan i.e. "image/jpeg".
// use "*/*" for any media
public MediaScannerWrapper(Context ctx, String filePath, String mime){
mPath = "/sdcard/DCIM/Camera";
mMimeType = "jpg";
mConnection = new MediaScannerConnection(ctx, this);
}
// do the scanning
public void scan() {
mConnection.connect();
}
// start the scan when scanner …Run Code Online (Sandbox Code Playgroud) Nexus 7,Ubuntu 12.04,Eclipse Juno
Nexus 7已设置为开发者模式.在Eclipse中,我可以在Android的"文件资源管理器"中看到列表.
我可以看到存储/模拟/遗留
但我看不到存储/模拟/ 0 /文件夹
重命名应用程序触发的文件之类的更改仅在重新启动Android设备后显示在USB-MTP界面上,或者在MediaScanner上注册新文件之后(请参阅特定路径(文件夹)上的触发媒体扫描程序),如何操作?):
file.renameTo(newFile);
MediaScannerConnection.scanFile(context,
new String[] { newFile.getAbsolutePath() }, null, null);
Run Code Online (Sandbox Code Playgroud)
USB-MTP用于通过USB访问Android设备的存储.例如,使用Windows资源管理器.
但是,使用Android 5.0.2(Build 10.6.A.0.454)下的Sony XPERIA Tablet Z(SGP321)文件夹newFile将成为一个4KB的文件.我不再能够使用Windows资源管理器访问文件夹结构,也无法将文件复制到我的计算机上.即使重启平板电脑!Android 4.4.4的相同设备不显示该行为.似乎只有USB-MTP视图被破坏.Android应用程序访问的文件结构看起来还不错.
问题:这种行为是错误还是我错误地实现了?什么是正确的实施?
到目前为止我为解决这个问题尝试了什么:
scanFile使用目录.MediaScannerConnection#scanFile.重启后,我可以再次使用Windows资源管理器访问该目录./sf/answers/1534265981/ 中建议的这一行不刷新USB-MTP视图,但也不会将目录转换为文件:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(newFile.getParentFile()));
Run Code Online (Sandbox Code Playgroud)也许相关:
android android-mediascanner sony-xperia android-5.0-lollipop
对于我的项目,我希望能够将传感器数据保存到文件中,并能够从PC访问它以进行进一步分析.这是我到目前为止的代码,它成功地运行:
File root = Environment.getExternalStorageDirectory();
File csvfile = new File(root, "Sensor_Data.csv");
FileWriter writer = new FileWriter(csvfile, true);
writer.append("Time");
writer.append(',');
writer.append("Position");
writer.append('\n');
Number data[] = new Number[4000];
for (int i = 0; i<4000; i+=2){
posHistory.toArray(data);
writer.append(String.valueOf(data[i]));
writer.append(',');
writer.append(String.valueOf(data[i+1]));
writer.append('\n');
}
writer.flush();
writer.close();
Run Code Online (Sandbox Code Playgroud)
问题是Nexus 7实际上没有外部存储(我相信它使用某种模拟器,以便与大多数在其代码中使用外部存储的应用程序兼容.)
运行此代码后,在设备上使用Astro文件管理器,我在四个位置看到"Sensor_Data.csv"文件:/ sdcard,/ storage/sdcard0,/ storage/emulated/0和/ storage/emulated/legacy.我可以使用texteditor或documentviewer从设备中打开每一个,所有数据都在那里.
问题是当我将Nexus 7连接到PC时,我只看到"内部存储",当打开时实际上只显示虚拟SD卡内容,而不是实际的内部存储,但.csv文件不存在.还有一个额外的目录"storage/emulated/legacy",但也没有任何内容,也没有"sdcard0"或"0"文件夹.当我记录"Environment.getExternalStorageDirectory().getAbsolutePath()"以确切地看到我得到的路径/存储/模拟/ 0
我已经尝试将文件保存在内部存储中的其他位置但没有成功,但我宁愿将其保留在"外部存储"中,以便该应用程序与使用外部存储的大多数设备兼容.
更新 所以在使用adb pull filename之后是结果:
adb pull /storage/emulated/0/Sensor_Data.csv
remote object '/storage/emulated/0/Sensor_Data.csv' does not exist
adb pull /storage/emulated/legacy/Sensor_Data.csv
243 Kb/s <1495 bytes in 0.006s>
adb pull /storage/sdcard0/Sensor_Data.csv
243 Kb/s <1495 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将文件下载到目录,该目录可能会根据用户选择的目录而有所不同。我将当前目录存储在文件对象中,现在尝试下载该文件。文件已下载,但未下载指定目录。那么,我该怎么做才能获取所选目录中的文件。
// Getting path to store the file
String path = root.getAbsolutePath();
path += curr.getName();
request.setDestinationInExternalPublicDir(path, new File(url).getName());
// get download service and enqueue file
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)
传递给 File 构造函数的名为 url 的字符串包含一个 URL。只需使用它来检索文件的名称即可。
更新:我刚刚找到该文件。是在手机里,不是在sd卡里。它位于此文件夹中,storage\emulated\00。不知道为什么?另外,我得到的绝对路径是 storage\emulated\0。
我有一个应用程序需要在连接到流时收集大量数据。我需要将这些数据保存到一个文件中,稍后我可以将其从设备中取出并使用标准计算机进行分析。
我的代码目前如下所示:
private void saveData(byte[] data){
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File file = new File(path, "_Ascent_Test.txt");
try {
FileOutputStream stream = new FileOutputStream(file, true);
stream.write(data);
stream.close();
Log.i("saveData", "Data Saved");
} catch (IOException e) {
Log.e("SAVE DATA", "Could not write file " + e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
它正确地命中“数据已保存”日志,没有任何错误,但当我从计算机浏览该文件时,我无法在设备内部存储中的任何位置找到该文件。
我缺少什么?
谢谢。
编辑:我需要在 Nexus 7 上运行它
android ×6
nexus-7 ×2
adb ×1
eclipse ×1
file ×1
file-io ×1
mediastore ×1
save ×1
saving-data ×1
sony-xperia ×1
ubuntu ×1