Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将图像保存到应用程序而不是画廊?_Java_Android - Fatal编程技术网

Java 如何将图像保存到应用程序而不是画廊?

Java 如何将图像保存到应用程序而不是画廊?,java,android,Java,Android,我正在制作一个应用程序,可以让用户通过密码保护照片。到目前为止,用户可以拍照并显示照片。但是,所有照片都会保存到相机卷中。我如何将它们保存到应用程序中而不是保存到相机卷中,以便它们可以是私有的,但仍然能够从它们的uri(我将保存到SharedReferences)中访问它们 public类MainActivity扩展了AppCompatActivity{ 列表视图列表视图; int-CAPTURE\u-IMAGE\u-ACTIVITY\u-REQUEST\u-CODE=0; Uri-imageU

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

public类MainActivity扩展了AppCompatActivity{
列表视图列表视图;
int-CAPTURE\u-IMAGE\u-ACTIVITY\u-REQUEST\u-CODE=0;
Uri-imageUri;
阵列适配器;
ArrayList ArrayList;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
}
});
}
公共空间takePic(视图){
意向意向=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
imageUri=Uri.fromFile(新文件(getApplicationContext().GetFileDir(),String.valueOf(System.currentTimeMillis()));
intent.putExtra(“数据”,imageUri);
startActivityForResult(意图、捕获、图像、活动、请求、代码);
}
}
}
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(resultCode==RESULT\u OK){
if(requestCode==捕获\图像\活动\请求\代码){
//在此处使用imageUri访问图像
Bundle extras=data.getExtras();
Log.e(“URI”,imageUri.toString());
位图bmp=(位图)附加.get(“数据”);
ImageView ImageView=(ImageView)findViewById(R.id.ImageView);
设置图像位图(bmp);
//在这里,您将获得位图形式的图像
}
else if(resultCode==RESULT\u取消){
Toast.makeText(此“照片未拍摄”,Toast.LENGTH\u SHORT);
}
}
}

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

使用
getApplicationContext().getFilesDir()代替
Environment.getExternalStorageDirectory()

如果您非常关心安全性,我认为您应该使用
getFilesDir()
。一个小提示,我面临着使用这种方法的挑战。我认为这是你应该注意的

您还可以使用
getApplicationContext.getExternalFilesDir(null);我传递了null,因为我不想放置Environment.DIRECTORY\u图片,这将允许媒体扫描仪找到图像文件并将其放入gallery。
这是我的建议文件

让我知道情况:)

编辑:

无论如何,由于媒体扫描仪相当智能,如果上述方法仍然不起作用


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

我将Environment.getExternalStorageDirectory()切换为getApplicationContext().GetFileDir(),但图片仍会保存到库中。还有什么我需要做的吗?这是我现在的代码:public void takePic(View View View){Intent Intent=new Intent(MediaStore.ACTION\u IMAGE\u CAPTURE);imageUri=Uri.fromFile(new File)(getApplicationContext().getFilesDir(),“filename”+String.valueOf(System.currentTimeMillis())+“.jpg”);intent.putExtra(“数据”,imageUri);startActivityForResult(intent,CAPTURE\u IMAGE\u ACTIVITY\u REQUEST\u CODE);}首先,由于无法读取,请不要将代码放在注释中。其次,在回答的第二部分中,我提到了使用
getApplicationContext.getExternalFilesDir(null)因为这不允许媒体扫描仪找到图像(文档建议是这样)。请尝试一下,并让我知道它是否有效。:)出于某种原因,我对我的回答做了一个小小的补充,没有。即使删除“.jpg”后,该图像仍然以gallary结尾。我把更新后的代码放在原始问题中
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);
        }
    }


}