【问题标题】:How can I save images to the app instead of the gallery?如何将图像保存到应用程序而不是图库?
【发布时间】:2016-02-26 08:14:45
【问题描述】:

我正在制作一个可以让用户使用密码保护照片的应用。到目前为止,用户可以拍照并显示照片。但是,所有照片都会保存到相机胶卷中。如何将它们保存到应用程序而不是相机胶卷,以便它们可以是私有的,但仍然能够从它们的 uri 访问它们(我将保存到 SharedPreferences)?

public class MainActivity extends AppCompatActivity {

    ListView listView;
    int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
    Uri imageUri;

    ArrayAdapter<String> adapter;
    ArrayList<String> arrayList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
            }
        });
    }


    public void takePic(View view) {

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        imageUri = Uri.fromFile(new File(getApplicationContext().getFilesDir(), String.valueOf(System.currentTimeMillis()) ));
        intent.putExtra("data", imageUri);
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
}





}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

            //use imageUri here to access the image

            Bundle extras = data.getExtras();

            Log.e("URI", imageUri.toString());
            Bitmap bmp = (Bitmap) extras.get("data");
            ImageView imageView = (ImageView) findViewById(R.id.imageView);

            imageView.setImageBitmap(bmp);

            // here you will get the image as bitmap


        }
        else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT);
        }
    }


}

【问题讨论】:

    标签: java android


    【解决方案1】:

    您需要将图像文件存储在内部目录中,这样画廊应用程序就无法访问它。

    getApplicationContext().getFilesDir();代替Environment.getExternalStorageDirectory()

    如果您非常关心安全性,我认为您应该使用getFilesDir()。一个小提示,我使用这种方法遇到了issue。我认为这是您应该注意的事情。

    你也可以使用getApplicationContext.getExternalFilesDir(null);;我传递了 null,因为我不想放置 Environment.DIRECTORY_PICTURES,这将允许 Media Scanner 找到图像文件并将其放入图库。 以下是我的建议文档getExternalFileDir()getFilesDir()

    让我知道进展如何:)

    编辑:

    不管怎样,既然 Media Scanner 很聪明,如果上述方法仍然不起作用......

    除了我的回答之外,如果媒体扫描仪仍然可以找到照片并将其放入图库,那么您可以玩一个小技巧来欺骗它。更改受密码保护的照片的文件扩展名。只有您的应用程序才会知道秘密扩展名。这可以通过散列文件名或简单地在文件名中添加“hahaFooledYou”之类的内容或去掉扩展名来实现。这虽然不是最巧妙的方法,但会奏效。 :)

    【讨论】:

    • 我将 Environment.getExternalStorageDirectory() 切换为 getApplicationContext().getFilesDir(),但图片仍会保存到图库中。我还有什么需要做的吗?
    • 这是我现在的代码: public void takePic(View view){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imageUri = Uri.fromFile(new File(getApplicationContext().getFilesDir(), "filename_" + String.valueOf(System.currentTimeMillis()) + ".jpg")); intent.putExtra("数据", imageUri); startActivityForResult(意图,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); }
    • 首先,请不要将代码放在 cmets 中,因为它无法阅读。其次,在我回答的第二部分中,我提到了使用getApplicationContext.getExternalFilesDir(null);,因为这不允许媒体扫描仪找到图像(或者文档建议)。请尝试一下,让我知道它是否有效。 :)
    • 对我的回答做了一点补充
    • 出于某种原因,没有。即使在删除“.jpg”之后,图像仍然会出现在画廊中。我将更新后的代码放在原始问题中
    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2013-06-21
    • 2014-08-26
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多