在我的应用程序中,当我尝试在应用程序内部存储下创建目录结构时,我看到很少崩溃,例如/data/data/[pkgname]/x/y/z....
这是失败的代码:
File clusterDirectory = new File(MyApplication.getContext().getFilesDir(), "store");
File baseDirectory = new File(clusterDirectory, "data");
if (!baseDirectory.exists()) {
if (!baseDirectory.mkdirs()) {
throw new RuntimeException("Can't create the directory: " + baseDirectory);
}
}
Run Code Online (Sandbox Code Playgroud)
尝试创建以下路径时,我的代码抛出了异常:
java.lang.RuntimeException: Can't create the directory: /data/data/my.app.pkgname/files/store/data
Run Code Online (Sandbox Code Playgroud)
我的清单指定了权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,即使它不需要用于此目的(由于Google Maps Android API v2,我的应用程序实际上是必需的).
它似乎与手机没有关系,因为我在旧手机和新手机上都有这个例外(最新的崩溃报告是Nexus 4和Android 4.3).
我的猜测是该目录/data/data/my.app.pkgname首先不存在,但由于权限问题,mkdirs()无法创建它,这可能吗?
任何提示?
谢谢
我想在设备上找到所有文件,在我的情况下是 pdf。现在我写了这段代码:
File images = Environment.getExternalStorageDirectory();
mImagelist = images.listFiles(new FilenameFilter(){
public boolean accept(File dir, String name)
{
return ((name.endsWith(".pdf")));
}
});
Run Code Online (Sandbox Code Playgroud)
此代码仅找到一个 pdf /storage/emulated/0/HTC_One_WWE_User_Guide.pdf。我的下载文件夹中还有其他几个 pdf。
我该如何解决这个问题?
较小的文件会成功上传到服务器,但当它来到较大的文件时,下面的代码会抛出内存不足错误.任何解决方案 .提前致谢.
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();
}
Run Code Online (Sandbox Code Playgroud) FileProvider我的应用程序中有一个,它假装它正在工作,但它打开的文件是空白的。我已经确认该文件已经在设备上的指定目录中并且不是空白的,但是当我尝试从我的应用程序内部打开它时它失败了。没有崩溃,也没有错误信息。有没有人见过这个?
文件提供者:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.my.redacted.provider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)
provider_paths.xml
<?xml version="1.0" encoding="utf-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_storage" path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)
编码:
var path = "/storage/emulated/0/MyApp/User/attachments/folder/attachment.pdf"
var file = new Java.IO.File(path);
var mime = MimeTypeMap.Singleton;
var ext = MimeTypeMap.GetFileExtensionFromUrl(path).ToLower();
var type = mime.GetMimeTypeFromExtension(ext);
var intent = new Intent();
intent.SetAction(Intent.ActionView);
var name = activity.PackageName + ".provider";
var uri = FileProvider.GetUriForFile(activity.ApplicationContext, name, file);
intent.SetDataAndType(uri, type);
intent.SetFlags(ActivityFlags.GrantReadUriPermission);
intent.SetFlags(ActivityFlags.GrantWriteUriPermission);
var packageManager = activity.PackageManager;
if (intent.ResolveActivity(packageManager) != null)
activity.RunOnUiThread(() => activity.StartActivity(intent)); …Run Code Online (Sandbox Code Playgroud) 我正在尝试从连接到我的 Google Pixel 的 USB 存储设备读取文件。我目前正在使用这种方法来选择驱动器的路径,以便我可以查询它的内容
private static final String TAG = "MainActivity";
private static final int REQUEST_CHOOSE_DRIVE = 1;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.text);
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(i, REQUEST_CHOOSE_DRIVE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CHOOSE_DRIVE) {
Uri uri = data.getData();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,Uri 看起来像是/tree/...在 Android 文件系统中似乎不是真实路径(通过 验证adb shell)。如何使用它uri来查询便携式存储设备的内容?我尝试使用此处给出的答案,但链接的函数返回 …
据我所知,用于getFilesDir()存储数据(在我的例子中是相机捕获的数据)有点临时。我这么说是因为如果我关闭并重新打开应用程序,我可以访问目录和文件列表,但不能访问文件本身。
是我的逻辑错误还是有意为之?
两种方法中,更推荐以下方法:
我之前使用过这个片段来编写一个带有名称和正文的简单文本文件:
public static File writeTextFile(String sFileName, String sBody) throws IOException {
File root = new File(Environment.getExternalStorageDirectory(), FOLDER_NAME);
if (!root.exists()) {
logFile("Not yet created, creating right now: " + root.getPath());
root.mkdirs();
logFile("Creation was successful? " + (root.exists() ? "Yes." : "No."));
} else {
logFile("Path exists: " + root.getPath());
}
File measurementFile = new File(root, sFileName);
FileWriter writer = new FileWriter(measurementFile);
writer.append(sBody);
writer.flush();
writer.close();
return measurementFile;
}
Run Code Online (Sandbox Code Playgroud)
除了 Android 11 之外,它运行良好,我今天在运行 Android 11 的 OnePlus N10 上进行测试后才意识到这一点。
问题是我没有收到任何描述的错误消息,只是一个简单的异常 …
我研究了下面的链接,但它没有回答我的问题. http://developer.android.com/guide/topics/data/data-storage.html#filesInternal
如果标题中的问题答案是肯定的.有人可以提供一个简单的例子来创建一个子文件夹并将文件添加到该文件夹吗?并且可能会显示如何从子文件夹中读取文件?
或者也许告诉我为什么下面的例子悲惨地失败了
更改file.mkdirs()后立即工作; to file.getParentFile().mkdirs();
请参阅以下答案中的说明
public static void Test(String path, String fileName, String fileStr, Context ctx)
{
SaveFile(path, fileName, fileStr, ctx);
String returnFileStr = ReadFile(path, fileName, ctx);
}
public static Boolean pathExists(String path, Context ctx)
{
Boolean result = false;
String[] pathSeqments = path.split("/");
String pathStr = "";
for(int i = 0;i<pathSeqments.length;i++ )
{
pathStr += pathSeqments[i];
if(!new File(ctx.getFilesDir() +"/" + pathStr).exists())
{
result = false;
break;
}
pathStr += "/";
result = true; …Run Code Online (Sandbox Code Playgroud) 我正在使用DownloadManager下载文件,我想将下载放在标准下载文件夹中,以便人们可以使用文件管理器在最明显的位置轻松找到它们:
Uri downloadLocation = Uri.fromFile(new File(Environment.DIRECTORY_DOWNLOADS, filename));
request.setDestinationUri(downloadLocation);
Long reference = downloadManager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)
但我得到一个例外,因为那不是外部驱动器.
有没有办法将文件下载到用户的下载文件夹?
而且,如果他们没有外部记忆,只是内部?
谢谢.
我的问题是,在某些设备上,从库中选取后,一些图像在ImageView中旋转.我发现了很多使用ExifInterface来解决这个问题的信息,所以我尝试使用它.但是当我尝试使用图像路径创建ExifInterface实例时,我有一个奇怪的例外.
W/ExifInterface: Invalid image
java.io.IOException: Invalid marker: 89
at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1598)
at android.media.ExifInterface.loadAttributes(ExifInterface.java:1334)
at android.media.ExifInterface.<init>(ExifInterface.java:1052)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.modifyOrientation(ProfileFragment.java:554)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.setLogo(ProfileFragment.java:515)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.onViewCreated(ProfileFragment.java:186)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1127)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5433)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我的道路没有错,因为我之前使用它并且它有效.这是我的代码.
private void setLogo() {
File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
+ "/Android/data/"
+ getActivity().getPackageName()
+ "/Files");
String mImageName="iGeoTrackUserAvatar.jpg";
File mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
// if (mediaFile.exists()) …Run Code Online (Sandbox Code Playgroud)