如何将图像保存到应用而不是图库?

时间:2016-02-23 23:25:56

标签: java android

我正在开发一款可让用户密码保护照片的应用。到目前为止,用户可以拍照并显示照片。但是,所有照片都会保存到相机胶卷中。如何将它们保存到应用程序而不是相机卷,这样它们可以是私有的,但仍然可以从它们的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);
        }
    }


}

1 个答案:

答案 0 :(得分:1)

您需要将图像文件存储在内部目录中,不允许图库应用访问它。

而不是Environment.getExternalStorageDirectory(),请使用getApplicationContext().getFilesDir();

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

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

让我知道它是怎么回事:))

编辑:

无论如何,由于Media Scanner非常聪明,如果上述方法仍然无效......

除了我的回答,如果Media Scanner仍然可以找到照片并放入画廊,那么你可以玩一个小技巧来欺骗它。更改受密码保护的照片的文件扩展名。只有您的应用才会知道秘密扩展。这可以通过散列文件名或者简单地添加诸如&#34; haha​​FooledYou&#34;之类的东西来实现。到文件名,或摆脱扩展名。这虽然不是最简单的方法,但仍然有效。 :)