当前位置: 首页 > 知识库问答 >
问题:

相机拍照后不保存

家浩瀚
2023-03-14

我可以按下一个按钮,打开原生相机app,成功拍下一张照片。但当我查看手机上的照片库或原生应用程序时,照片并没有保存在那里。我对Android很陌生,所以很可能我的代码中遗漏了一些重要的东西。

问题:

1)这些图片保存在哪里?

2)我是否可以修改下面的代码,以保存到内部存储,所以所有的图片拍摄与我的应用程序是私人的,只能通过我的应用程序访问?

3)如果我想将这些图片连同一些文本/其他输入一起保存到一个对象中,最好的方法是什么?我应该只保存一个URI或一些标识符以便以后引用该图像,还是保存实际的位图图像?

非常感谢任何帮助,谢谢!

下面是我拍摄照片的代码:

mImageButton.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        imageUri = CameraUtils.getOutputMediaFileUri(CameraUtils.MEDIA_TYPE_IMAGE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUEST_IMAGE);
    }
}

camerautils类直接摘自Google developer Guides:

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");

    if (!mediaStorageDir.exists())
    {
        if (!mediaStorageDir.mkdirs())
        {
            return null;
        }
    }

    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;
}

共有1个答案

狄睿
2023-03-14

1)通过查看代码,我希望图片保存在一个名为“camera”的目录中,该目录可以在您的设备(外部存储)上的pictures文件夹中找到。这些可能不会立即出现在你的图库中,但是在Android的后期版本中(Kitkat和jelly-bean,虽然我现在还不能证实这一点),你应该可以打开Photos应用程序,在其中的某个地方找到它们。如果情况并非如此,那么启动一个文件资源管理器应用程序(例如ASTRO file Manager或X-Plore)并浏览到Pictures/Camera目录,在那里您应该看到您的图像。下次你的媒体被重新索引时(手机重新启动,或者从别处触发重新索引),你应该会在你的图库/照片应用程序中看到这些图片。如果您想以编程方式刷新媒体,这里可能会有帮助。最后,确保在您的Android清单中具有READ_EXTERNAL_STORAGE权限,具体如下(Android doc)。

2)如果你想把图片保存为只对你的应用程序可用,你需要把它们保存到你的应用程序的内部数据目录中。直接从Android文档中看一下。确保使用MODE_PRIVATE标志。

3)为此,您需要将文件路径存储在应用程序可以访问的地方。您可以将文件路径保存到包含其他文本数据的文本文件中,也可以使用sqlite数据库。最后,您可以使用ORMLite for Android这样的ORM来保存一个Java对象,该对象可能保存图片的数据,并包含一些您想要保存的字段(标题、描述、路径等)。这里和这里是关于如何在Android中开始使用SQLite数据库的介绍(直接来自官方文档)。如果你想使用ORMLite,他们的网站上有大量的信息。开发人员花了很多时间回答StackOverflow问题。

你的所有问题都可以通过几个简单的谷歌搜索得到答案。它们是在Android中要做的非常标准和基本的事情,所以你应该可以在网上找到过多的信息和教程

编辑:

关于你对第二个问题的评论。这是我可能会做的事情(或类似的事情):

注意,我没有测试这个。这是从我的头顶。如果你有更多的问题在这里评论!

activity代码...

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);
            // Load the bitmap from the path and display it somewhere, or whatever
        }
        else if (resultCode == RESULT_CANCELED)
        {
            //Cancel code
        }
    }
}

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) // Used to be 'private void ...'
{
    if (!mediaStorageDir.exists())
    {
        mediaStorageDir.mkdirs(); // Used to be 'mediaStorage.mkdirs();'
    }
} // Was flipped the other way

private static File createFile(int type, File mediaStorageDir ) // Used to be 'private File ...'
{
    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);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0)
        {
            out.write(buf, 0, len);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
        //Handle error
    }
    finally
    {
        try {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                in.close();
            }
        } catch (IOException e) {
            // Eh
        }
    }
    return destinationInternalImageFile.getPath();
}

现在,您有了指向内部存储映像的路径,然后可以从OnActivityResult中操作/加载该映像。

 类似资料:
  • 我已经阅读了几个文档和堆栈,但是我不太确定如何实现这个。。。 帮助或示例代码将真正帮助我理解更多。 下面是运行相机的代码集,它工作得非常好,我的下一个问题是,我如何让它自动保存到手机库中?

  • 所以我遇到了一个问题,前面在我提问的问题中提到过:将图像(ACTION_image_CAPTURE)上载到Firebase存储 我对这个问题进行了更多的搜索,并应用了Android Studio文档:https://developer.android.com/training/camera/photobasics.html#TaskPhotoView 所以,在您阅读代码之前,我基本上想说一下需要什

  • 在我从相机中拍摄了照片之后,在onActivityResult(int requestCode,int resultCode,Intent data)方法中调用。在本例中,我得到了一个NPE,因为数据是空的。 编辑

  • 问题内容: 我已经在此问题上停留了一段时间,并查看了各种教程以寻求帮助,但尚未成功。 我实质上已经在我的 应用程序中 利用了该功能来 拍照 并显示它, 但是 它无法保存拍照。 这是包含我试图使其根据教程发挥作用的代码: 我已经在文件中包含了所有必要的内容。 问题答案: File imagesFolder = new File(Environment.getExternalStorageDirect

  • 我是Android的新手。我正在我的Android应用程序中创建ImageUpload活动,但它在Apk(23)下运行良好。但每当我在AndroidMarshmallow上尝试它时,点击图片后它就会崩溃。 这是日志 java.lang.RuntimeException:将结果ResultInfo{who=null,request=1,result=-1,data=intent{}}传递到活动{co

  • 问题内容: 在Swift 2.3中,我使用以下代码在自定义相机中拍照: 但是他的话: 显示此错误: 类型“ AVCapturePhotoOutput”的值没有成员“ captureStillImageAsynchronouslyFromConnection” 我尝试解决问题,但是我总是收到越来越多的错误,所以这就是我发布原始代码的原因。 有人知道如何使我的代码再次起作用吗? 谢谢。 问题答案: 多