我正在使用API演示中的MediaScannerConnection示例代码
我正在使用的片段是:
MediaScannerConnection.scanFile(
context,
new String[] { permFile.getAbsolutePath() },
null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
android.util.Log.i("ExternalStorage", "Scanned " + path + ":");
android.util.Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我从LogCat获得一个带有以下内容的FC对话框:
4-20 23:17:45.988: ERROR/ActivityThread(3015): Activity com.my.package.name has leaked ServiceConnection android.media.MediaScannerConnection@40715c70 that was originally bound here
04-20 23:17:45.988: ERROR/ActivityThread(3015): android.app.ServiceConnectionLeaked: Activity com.my.package.name has leaked ServiceConnection android.media.MediaScannerConnection@40715c70 that was originally bound here
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?仅供我使用AsyncTask从后台线程运行此功能.
我在开发的应用程序在这里遇到了一个奇怪的问题。它使用Apache Codova 3.0.0和库存文件插件在具有Android 4.3的Samsung Galaxy Nexus的外部存储上创建目录,并在其中添加一些文件。
这里发生的是,我实际上可以执行此操作,但是当我将设备作为大容量存储设备连接到计算机时,创建的目录(包括文件)没有显示。除我创建的文件夹外,所有其他文件夹均正常显示。但是,当我使用“ adb shell”浏览设备时,我可以看到该文件夹,并且其来自“ ls -al”的目录模式与所有其他文件夹的模式完全相同。读取和写入权限被授予该应用程序。
我也在Android代码中尝试过相同的方法,其行为完全相同:
File f = new File(Environment.getExternalStorageDirectory().toString()+"/myFolder");
if (!f.isDirectory()) {
f.mkdir();
Log.i("myApp", "Created directory: "+f);
}
Run Code Online (Sandbox Code Playgroud)
该操作成功,但是当我将设备重新连接到计算机时,该文件夹再次不可见。提及一下:我从IDE运行应用程序-也许:是否有一个沙盒或我不知道的沙盒,可能会导致使用adb shell在/ sdcard中显示内容,但在连接为外部存储时却没有显示?
我想我必须在这里想念一些基本的东西,希望你们对我有一个答案:)
谢谢!
如何在Android的内部存储(?)中创建一个新文件夹(我想说,主文件夹包含所有子文件夹... Whatsapp,DCIM,图片,铃声,闹钟..),并在其中创建一个新.txt文件在此文件夹中。
我要创建一个.txt文件,我需要用户将USB电缆插入他们的计算机,访问该设备,输入我的应用程序创建的文件夹,然后将此文件复制到他们的桌面。
我尝试使用以下代码创建文件:
procedure TF_start.Button2Click(Sender: TObject);
var
output_text: string;
arquivo: TextFile;
begin
output_text := 'test';
TFile.WriteAllText(TPath.Combine(TPath.GetDocumentsPath, 'test.txt'), 'content');
ReWrite(arquivo);
WriteLn(arquivo, output_text);
CloseFile(arquivo);
end;
Run Code Online (Sandbox Code Playgroud)
但这行不通。
要获取内部存储(?)路径,我找到了以下代码:
P := '/storage/';
if (FindFirst(P + '*', faAnyFile, Sr) = 0) then
repeat
Memo1.Lines.Add(Sr.Name);
until (FindNext(Sr) <> 0);
FindClose(Sr);
Run Code Online (Sandbox Code Playgroud)
但是我不明白它是如何工作的,所以我什至不能使用它。
我也找到了此链接,但是没有找到任何函数返回我要创建文件夹的“常规”目录路径。
函数System.IOUtils.TPath.GetHomePath(),并System.IOUtils.TPath.GetDocumentsPath()没有返回正确的路径。
System.SysUtils.GetHomePath() 返回-> /data/user/0/com.embarcadero.app/cache
System.IOUtils.TPath.GetDocumentsPath() 返回-> /data/com.embarcadero.app-1/lib/arm
@编辑
使用@Remy Lebeau代码和这段代码,我设法做到了这一点。问题是用文件更新目录的代码什么都不做
Use System.IOUtils, Androidapi.Helpers, Androidapi.Jni.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText;
Run Code Online (Sandbox Code Playgroud)
//按钮
procedure TF_start.Button2Click(Sender: …Run Code Online (Sandbox Code Playgroud)