1) 从代码来看,我预期图片应该保存在设备外部存储的Pictures文件夹下面的一个名为'camera'的目录中。这些图片可能不会立即出现在您的相册中,但在Android的较新版本(Kitkat和也许是jelly-bean,尽管我不能立即验证)中,您应该能够打开照片应用程序并在其中找到它们。如果不是这种情况,则启动一个文件浏览器应用程序(例如ASTRO File Manager或X-Plore)并浏览到Pictures/camera目录,您将在其中看到您的图像。下次您的媒体重新索引(手机重新启动或从其他地方触发的重新索引)时,您应该能够在您的相册/照片应用程序中看到这些图片。如果您想要以编程方式刷新媒体,这里可能有所帮助。最后,请确保您在Android清单中具有READ_EXTERNAL_STORAGE权限,如此文档中所述。
2) 如果您想要保存只供您的应用程序使用的图像,则需要将它们保存在您的应用程序的内部数据目录中。从Android文档中直接查看这里。确保使用MODE_PRIVATE标志。
3) 对于这个问题,您需要将文件路径存储在应用程序可以访问的某个位置。您可以将文件路径与其他文本数据保存到文本文件中,也可以使用sqlite数据库。最后,您可以使用像ORMLite for Android这样的ORM来保存可能包含要持久化的字段(标题、描述、路径等)的图片数据的Java对象。这里和这里是有关如何在Android中开始使用SQLite数据库的介绍(直接来自官方文档)。如果您想使用ORMLite,则可以在他们的网站这里上找到大量信息。该开发者花了很多时间回答StackOverflow的问题。
您的所有问题都可以通过一些简单的谷歌搜索来解决。它们是Android中非常标准和基本的操作,因此您应该能够在网上找到大量的信息和教程。
编辑:
针对您关于第二个问题的评论。这就是我可能会做的(或类似的事情):
请注意,我没有测试过这个。它来自我的头脑。如果您有更多问题,请在此处发表评论!
Activity code...
mImageButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageUri = CameraUtils.getOutputMediaFileUri(currentActivity, CameraUtils.MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUEST_IMAGE);
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_IMAGE)
{
if (resultCode == RESULT_OK)
{
String pathToInternallyStoredImage = CameraUtils.saveToInternalStorage(this, imageUri);
}
else if (resultCode == RESULT_CANCELED)
{
}
}
}
CameraUtils类的代码...
public static Uri getOutputMediaFileUri(int type)
{
return Uri.fromFile(getOutputMediaFile(type));
}
public static File getOutputMediaFile(int type)
{
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "camera");
createMediaStorageDir(mediaStorageDir);
return createFile(type, mediaStorageDir);
}
private static File getOutputInternalMediaFile(Context context, int type)
{
File mediaStorageDir = new File(context.getFilesDir(), "myInternalPicturesDir");
createMediaStorageDir(mediaStorageDir);
return createFile(type, mediaStorageDir);
}
private static void createMediaStorageDir(File mediaStorageDir)
{
if (!mediaStorageDir.exists())
{
mediaStorageDir.mkdirs();
}
}
private static File createFile(int type, File mediaStorageDir )
{
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = null;
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");
}
return mediaFile;
}
public static String saveToInternalStorage(Context context, Uri tempUri)
{
InputStream in = null;
OutputStream out = null;
File sourceExternalImageFile = new File(tempUri.getPath());
File destinationInternalImageFile = new File(getOutputInternalMediaFile(context).getPath());
try
{
destinationInternalImageFile.createNewFile();
in = new FileInputStream(sourceExternalImageFile);
out = new FileOutputStream(destinationInternalImageFile);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0)
{
out.write(buf, 0, len);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try {
if (in != null) {
in.close();
}
if (out != null) {
in.close();
}
} catch (IOException e) {
}
}
return destinationInternalImageFile.getPath();
}
现在你有了指向内部存储图像的路径,然后可以从onActivityResult中操作/加载该图像。
WRITE_EXTERNAL_STORAGE
权限时,它才能正常工作。https://developer.android.com/training/data-storage#permissions - Kidus Tekeste