拍照并将其保存到内部存储器

3

我想拍照并将其保存在内部存储中,这样只有我的应用程序才能访问照片。我该怎么做?我尝试了很多方法都没有成功,即使是Google的官方文档也有问题。这是我的实际代码,它保存在公共目录:

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pictures);

        imageView = (ImageView)findViewById(R.id.imageView);
        fabNewPicture = (FloatingActionButton)findViewById(R.id.fab_new_picture);
        fabNewPicture.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                takePicture(v);
            }
        });

        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
        }
    }

    private void takePicture(View v)
    {
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = Uri.fromFile(getOutputMediaFile());
        i.putExtra(MediaStore.EXTRA_OUTPUT, file);

        startActivityForResult(i, 100);
    }

    private static File getOutputMediaFile()
    {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "FotoAula");

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

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        return new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 100) {
            if (resultCode == RESULT_OK) {
                imageView.setImageURI(file);
            }
        }
    }

但这样图片将成为公共的,并且甚至可以在相册中使用,我不想这样,因为我需要为每张图片添加一些数据库信息,所以我需要它们对我的应用程序是私有的...如何做到这一点?谢谢!

以下是可能适合您的答案: http://stackoverflow.com/questions/22574350/how-to-keep-images-private-to-the-app-and-not-viewable-in-the-gallery - Maxim Berezovsky
你可以做两件事情。第一,使用句点(.)前缀保存你的图片。这样可以将图片从图库中隐藏起来。第二,参考此链接 https://developer.android.com/guide/topics/data/data-storage.html#filesInternal 使用 openFileOutput(FILENAME, Context.MODE_PRIVATE); 并保存你的图片。 - RajSharma
“.”前缀更像是一种解决方法,对吗?还是在这种情况下真的被使用了? - user3159043
你能帮我写第二种情况的代码吗?我很难理解拍照的概念。 - user3159043
4个回答

2

如果您将照片保存在SD卡或外部存储器上,任何应用程序都可以访问它。尝试获取私有目录并将照片保存在其中。

取自此处

要创建和写入一个私有文件到内部存储器:

1-使用文件名和操作模式调用openFileOutput()。这将返回一个FileOutputStream

2-使用write()向文件中写入数据。

3-使用close()关闭流。

例如:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

阅读“使用内部存储”:链接

我正在尝试做这件事,但由于我对拍照概念的理解不够深入,所以我很难让它正常工作。 - user3159043
你的应用程序不需要自己拍照,相片是由你的应用程序发送的意图响应中从设备上的相机应用程序中获取的。你需要读取图片并复制到内部存储器。请阅读此文章: https://developer.android.com/training/camera/photobasics.html - Yorbenys Pardo Rodríguez

2
您无法使用相机意图拍照并保存到内部存储中。根据Android文档,这是不被允许的。

一般来说,用户使用设备相机拍摄的任何照片都应该保存在公共外部存储器上,以便所有应用程序都可以访问。

然而,

如果您希望这些照片仅供您的应用程序使用,请改用getExternalFilesDir()提供的目录。在Android 4.3及更低版本中,对此目录的写入也需要WRITE_EXTERNAL_STORAGE权限。从Android 4.4开始,不再需要此权限,因为其他应用程序无法访问该目录,所以您可以通过添加maxSdkVersion属性来声明仅应在较低版本的Android上请求权限:


"最初的回答"
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                 android:maxSdkVersion="18" />
...
</manifest>

所以你需要将getOutputMediaFile()方法更改为以下内容: "最初的回答"
private static File getOutputMediaFile()
{
    File mediaStorageDir = context.getExternalFilesDir("FotoAula");

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

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    return new File(mediaStorageDir.getPath() + File.separator +
            "IMG_"+ timeStamp + ".jpg");
}

0

你可以在保存图片的文件夹中创建一个.nomedia文件,这样其他应用程序中的媒体扫描器将忽略你的文件夹。


-2

私有内部存储不存在。保存图片时,请尝试删除后缀。这样其他应用程序就不会将其视为图片。


但是我可以用这种方式保存图片吗?我怎样才能在后面显示它而不带后缀呢?只有在显示时添加后缀吗?如果用户卸载应用程序时删除了存储,那么内部的存储呢? - user3159043
文件内容的定义取决于字节而不是后缀名。一张图片即使没有后缀名也始终是一张图片。您可以在应用程序中展示没有后缀名的图片。 - Qian Sijianhao
如果您选择将其保存在SD卡上,则卸载后照片仍将存在。 - Qian Sijianhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接