当我启动我的Android应用程序时,我需要在SD卡上创建一个目录,对于少数用户而言这是失败的,我无法弄清楚它的原因......
(我发现WRITE_EXTERNAL_STORAGE权限丢失导致类似的问题,它就在那里,它适用于几乎所有用户,所以我认为这不是原因)
我已经简化了以前的情况,以便更容易解释,如果创建一个directoy失败,我运行一个测试用例,我尝试在sdcard上创建一个.test目录:
new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false
Run Code Online (Sandbox Code Playgroud)
相关目录的文件属性:
/sdcard/.test(exists = false canWrite = false canRead = false canExecute = err isDirectory = false isFile = false)
/ sdcard(exists = true canWrite = true canRead = true canExecute = err isDirectory = true isFile = false)
/(exists = true canWrite = false canRead = true canExecute = err isDirectory = true isFile = false)
getExternalStorageState =装
(canExecute返回错误,因为测试是在sdk <9上运行的)
建议和想法非常受欢迎......
我的文件res/raw夹里有一些音频文件.出于某些原因,我想将这些文件复制到我的SDCard当我的应用程序启动时.
我怎么能这样做?有人指导我吗?
我正在使用自定义视图,并且我正在使用画布,用户可以在其中绘制任何内容,之后我想将该图像保存在SD卡中,但是无法做到这一点.不知道发生了什么.
else if(view.getId()==R.id.save_btn){
//save drawing
AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
saveDialog.setTitle("Save drawing");
saveDialog.setMessage("Save drawing to device Gallery?");
saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
private FileOutputStream fOut;
public void onClick(DialogInterface dialog, int which){
//save drawing
drawView.setDrawingCacheEnabled(true);
//attempt to save
String imgSaved = MediaStore.Images.Media.insertImage(
getContentResolver(), drawView.getDrawingCache(),
UUID.randomUUID().toString()+".png", "drawing");
//feedback
if(imgSaved!=null){
Toast savedToast = Toast.makeText(getApplicationContext(),
"Drawing saved to Gallery!", Toast.LENGTH_SHORT);
savedToast.show();
}
else{
Toast unsavedToast = Toast.makeText(getApplicationContext(),
"Oops! Image could not be saved.", Toast.LENGTH_SHORT);
unsavedToast.show();
}
drawView.destroyDrawingCache();
}
});
saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, …Run Code Online (Sandbox Code Playgroud) 我正在使用教程创建一个图库应用程序,但收到以下错误:
abc目录路径无效!请设置图像目录名AppConstant.java类
请访问以下链接以查看整个教程的代码,因为我使用相同的代码:
我在UtilsClass中找到了这段代码:
else {//图像目录为空Toast.makeText(_context,AppConstant.PHOTO_ALBUM +"为空.请加载一些图像!",Toast.LENGTH_LONG).show(); }
} else {
AlertDialog.Builder alert = new AlertDialog.Builder(_context);
alert.setTitle("Error!");
alert.setMessage(AppConstant.PHOTO_ALBUM
+ " directory path is not valid! Please set the image directory name AppConstant.java class");
alert.setPositiveButton("OK", null);
alert.show();
}
return filePaths;
Run Code Online (Sandbox Code Playgroud)
如何以编程方式创建缺少的目录而不是显示此错误对话框?
大多数新的Android设备都有内部SD卡和外部SD卡.我想制作一个文件浏览器应用程序,但我无法找到如何获取在我的应用程序中使用的路径,因为
File file = Environment.getExternalStorageDirectory();
Run Code Online (Sandbox Code Playgroud)
只是在大多数设备中返回,/mnt/sdcard
但是另一个外部SD卡的路径就像/storage1 or /storage2
.任何帮助赞赏.
我正在尝试使用以下代码将文件写入SDCard(android.permission.WRITE_EXTERNAL_STORAGE已在manifest.xml中设置权限).执行nmea_file.createNewFile();它时抛出异常Permission Denied.
任何猜测为什么会发生这种情况?
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
Log.d(TAG, "Sdcard was not mounted !!" );
}
else
{
File nmea_file;
File root = Environment.getExternalStorageDirectory();
FileWriter nmea_writer = null;
try {
nmea_file = new File(root,"NMEA.txt");
if(!nmea_file.exists()) {
Log.w(TAG, "File Doesn't Exists!");
nmea_file.createNewFile();
}
nmea_writer = new FileWriter(nmea_file);
nmea_writer.append(nmea);
nmea_writer.flush();
}
catch (IOException e)
{
Log.w(TAG, "Unable to write", e);
}
finally
{
if (nmea_writer != null)
{
try
{
nmea_writer.close();
}
catch (IOException e)
{
Log.w(TAG, "Exception closing …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android应用程序,需要查看用户存储的图像.问题是如果用户通过USB线安装了SD卡,我就无法读取磁盘上的图像列表.
有没有人知道如何判断usb是否已安装,以便我可以弹出一条消息通知用户它不起作用?
我当前项目的一部分是从URL下载图像然后保存到SDCard.但问题是所有在sdcard中保存的图像都显示在android gallery页面中.我想要的是" 我不想在Android画廊中保存所有已保存的图像. "
我需要将使用我的应用程序拍摄的照片保存在特定文件夹中.我已经阅读了很多这个问题的解决方案,但我无法使它们中的任何一个工作,所以我寻求帮助.
MainActivity.java
public void onClick(View v) {
Intent camera = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
//Folder is already created
String dirName = Environment.getExternalStorageDirectory().getPath()
+ "/MyAppFolder/MyApp" + n + ".png";
Uri uriSavedImage = Uri.fromFile(new File(dirName));
camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
startActivityForResult(camera, 1);
n++;
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml中
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud) android android-sdcard android-gallery android-camera-intent
我们刚刚违反了适用于在Android 4.4上将文件写入SD卡(外部存储)的新权限(EACCES权限被拒绝)
在KitKat之前,我们设置了可写文件夹,如下所示:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";
Run Code Online (Sandbox Code Playgroud)
然而,经过几个小时的搜索,我得出结论,无论是对还是错,在4.4设备上启用文件写入需要将其更改为:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";
Run Code Online (Sandbox Code Playgroud)
所以mfolder会是这样的:/mnt/sdcard/Android/data/com.xyz.abc/appfiles
这是正确的,我们是否在sdcard上创建了一个像上面那样的文件夹来启用4.4设备来写文件?
mfolder是我们保存为共享首选项的String.
然后,如果API> = 19,我们将运行此代码,该代码将更改mfolder String,然后将旧文件夹中的所有文件复制到新的"kitkat"文件夹.
if (android.os.Build.VERSION.SDK_INT>=19){
if (!mfolder.contains("/Android/data/com.xyz.abc/appfiles")){
if (prefs.getBoolean("kitkatcheck", false)==false){
//update mfolder from
// /mnt/sdcard/appfiles
// to
// /mnt/sdcard/Android/data/com.xyz.abc/appfiles
String prekitkatfolder = mfolder;
String kitkatfolder = mfolder.replace("/appfiles", "/Android/data/com.xyz.abc/appfiles");
mfolder = kitkatfolder;
try {
File sd = new File(mfolder);
if(!sd.exists() || !sd.isDirectory()) {
sd.mkdirs();
}
} catch (Exception e) {
Toast.makeText(getBaseContext(), "Error creating Kitkat folder!\n" + e.toString(), Toast.LENGTH_LONG).show();
return;
}
prefEditor.putString("patternfolder", mfolder);
prefEditor.putBoolean("kitkatcheck", …Run Code Online (Sandbox Code Playgroud) android ×10
android-sdcard ×10
android-file ×1
canvas ×1
file ×1
file-copying ×1
mediastore ×1
mkdir ×1