我有一个自定义相机Android应用程序,根据Google教程将捕获的图像保存到外部存储器中,然后Media Scanner触发Gallery检测它们。
但我有一个新的LG G2客户端没有SD卡插槽,没有外部存储器 - 只有内部。
我向他解释说我只能让我的应用程序将图像存储在应用程序的内部缓存中,并且他会通过某种类型的Root Explorer访问它们。
但他声称其他购买的相机应用程序存储了他们的图像,以便Gallery可以检测到它们。怎么样?请帮忙 - 我也需要让我的应用程序能够做到这一点。
谢谢!
UPD:以下是我的代码,适用于其他设备,主要处理外部存储器:
public static File getBaseFolder() {
File f;
f = null;
try {
f = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
} catch (Exception e) {
Utils.toasterLong("Error accessing storage: " + e.getMessage());
}
return f;
}
public static File getImageFolder() {
File f;
f = null;
try {
f = new File(getBaseFolder(), "Magic");
} catch (Exception e) {
Utils.toasterLong("Error accessing storage: " + e.getMessage());
}
return f;
}
/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type) {
return Uri.fromFile(getOutputMediaFile(type));
}
/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type) {
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = getImageFolder();
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d(TAG, "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "IMG_" + timeStamp + ".jpg");
} else if (type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "VID_" + timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
以及将图像写入外部存储器并触发扫描器的代码部分:
{
pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null) {
writeErrorDirty = true;
if (MyDebug.LOG)
Log.d(TAG,
"Error creating media file, check storage permissions");
} else if (MyDebug.LOG)
Log.d(TAG, "Valid path=" + pictureFile.getAbsolutePath());
FileOutputStream out = null;
try {
out = new FileOutputStream(pictureFile);
picTaken_mod.compress(Bitmap.CompressFormat.JPEG, 90, out);
} catch (Exception e) {
e.printStackTrace();
writeErrorDirty = true;
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
writeErrorDirty = true;
if (MyDebug.LOG)
Log.d(TAG,
"Error writing media file, check storage permissions");
}
} // end try
try {
MediaScannerConnection.scanFile(grandContext,
new String[] { pictureFile.getAbsolutePath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
// now visible in gallery
}
});
} catch (Exception e) {
if (MyDebug.LOG)
Log.d(TAG,
"Error broadcasting the image: " + e.getMessage());
// writeErrorDirty = true;
}
}
答案 0 :(得分:1)
但我有一个新的LG G2客户端没有SD卡插槽,没有外部存储器 - 只有内部。
您在该设备上同时拥有internal storage和external storage。您可能没有removable storage,但可移动存储不是内部存储,也不是外部存储。
请理解Android SDK所指的内部存储和外部存储与Android SDK相关联,因为它不一定与向用户显示的信息对齐(例如,在“设置”中)。
但他声称其他购买的相机应用程序存储了他们的图像,以便Gallery可以检测到它们。怎么样?
他们将图片写入外部存储空间,然后使用MediaScannerConnection
通知图库以及其他使用文件所在的MediaStore
ContentProvider
的应用。