在另一个 activity 中显示捕获的图像
Displaying captured image in another activity
我正在开发一个 android 应用程序,它的一部分需要用户拍照,当用户拍照时,它会将照片保存到文件系统并启动一个新的 activity 显示最近拍摄的照片。 activity 开始没有问题,只是它是空白的!
当我通过手动输入路径将路径硬编码为字符串时,图像出现了,这是什么问题?
这是保存文件和创建意图的方法;
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File f = capturePicture();
Intent intent = new
Intent(postSharingActivity.this, settingPostParam.class);
intent.putExtra("picture", f);
startActivity(intent);
}
});
这是另一个activity正在检索图像文件;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting_post_param);
savedImage = findViewById(R.id.savedImage);
File pic = (File) getIntent().getExtras().get("picture");
Uri uri = Uri.fromFile(pic);
Toast.makeText(settingPostParam.this, "+uri.toString(),Toast.LENGTH_LONG)
.show();
if (isStoragePermissionGranted()) {
Picasso.get().load(uri).into(savedImage);
} else {
Toast.makeText(settingPostParam.this, "error", Toast.LENGTH_LONG).show();
}
}
更新:我发现了问题,它在 capturePicture() 完成之前执行了意图。它甚至在保存文件之前就采用了路径!
所以我改回原来的方式,即改变观点而不是活动。
并添加了 AsyncTask。
private class myAsyncTask extends AsyncTask<Void,Void,Void>{
File f;
@Override
protected Void doInBackground(Void... voids) {
f= capturePicture();
return null;
}
@Override
protected void onPostExecute(Void result){
String rr = f.getAbsolutePath();
File g=new File(rr);
Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
Uri uri = Uri.fromFile(g);
Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
if(isStoragePermissionGranted()){
savedImage.setImageURI(uri);
cameraPreviewView.setVisibility(View.GONE);
postCaptureView.setVisibility(View.VISIBLE);
} else{
Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
}
}
}
这里是 onClickListener
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new myAsyncTask().execute();
}
});
我测试了,还是一样的问题,Toasts的顺序是:
onBloodyClick: /storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
URI:file:////storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
已保存:/storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
第三个在capturePicture()方法中。
我在这里做错了什么?并感谢您的回复。
不要通过intent传递文件对象,传递文件的路径(String)。
intent.putExtra("picture",f.getAbsolutePath());
然后,从这个代码中接收文件路径
File pic = new File( getIntent().getStringExtras("picture"));
我找到了。
问题出在方法的调用和返回类型上。
doInBackground方法的返回类型和两个方法的params类型,onPostExecute将使用doInBackground方法的结果文件
private class myAsyncTask extends AsyncTask<File,Void,File>{
@Override
protected File doInBackground(File... voids) {
File f = capturePicture();
return f;
}
@Override
protected void onPostExecute(File f){
String rr = f.getAbsolutePath();
File g=new File(rr);
Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
Uri uri = Uri.fromFile(g);
Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
if(isStoragePermissionGranted()){
savedImage.setImageURI(uri);
cameraPreviewView.setVisibility(View.GONE);
postCaptureView.setVisibility(View.VISIBLE);
} else{
Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
}
}
}
然后在 onClickListener 上指定顺序
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myAsyncTask task=new myAsyncTask();
task.doInBackground();
task.execute();
}
});
我正在开发一个 android 应用程序,它的一部分需要用户拍照,当用户拍照时,它会将照片保存到文件系统并启动一个新的 activity 显示最近拍摄的照片。 activity 开始没有问题,只是它是空白的!
当我通过手动输入路径将路径硬编码为字符串时,图像出现了,这是什么问题?
这是保存文件和创建意图的方法;
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File f = capturePicture();
Intent intent = new
Intent(postSharingActivity.this, settingPostParam.class);
intent.putExtra("picture", f);
startActivity(intent);
}
});
这是另一个activity正在检索图像文件;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting_post_param);
savedImage = findViewById(R.id.savedImage);
File pic = (File) getIntent().getExtras().get("picture");
Uri uri = Uri.fromFile(pic);
Toast.makeText(settingPostParam.this, "+uri.toString(),Toast.LENGTH_LONG)
.show();
if (isStoragePermissionGranted()) {
Picasso.get().load(uri).into(savedImage);
} else {
Toast.makeText(settingPostParam.this, "error", Toast.LENGTH_LONG).show();
}
}
更新:我发现了问题,它在 capturePicture() 完成之前执行了意图。它甚至在保存文件之前就采用了路径! 所以我改回原来的方式,即改变观点而不是活动。 并添加了 AsyncTask。
private class myAsyncTask extends AsyncTask<Void,Void,Void>{
File f;
@Override
protected Void doInBackground(Void... voids) {
f= capturePicture();
return null;
}
@Override
protected void onPostExecute(Void result){
String rr = f.getAbsolutePath();
File g=new File(rr);
Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
Uri uri = Uri.fromFile(g);
Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
if(isStoragePermissionGranted()){
savedImage.setImageURI(uri);
cameraPreviewView.setVisibility(View.GONE);
postCaptureView.setVisibility(View.VISIBLE);
} else{
Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
}
}
}
这里是 onClickListener
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new myAsyncTask().execute();
}
});
我测试了,还是一样的问题,Toasts的顺序是:
onBloodyClick: /storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
URI:file:////storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
已保存:/storage/0/emulated/0/DCIM/Camera/IMG_20180604_104845.jpg
第三个在capturePicture()方法中。 我在这里做错了什么?并感谢您的回复。
不要通过intent传递文件对象,传递文件的路径(String)。
intent.putExtra("picture",f.getAbsolutePath());
然后,从这个代码中接收文件路径
File pic = new File( getIntent().getStringExtras("picture"));
我找到了。 问题出在方法的调用和返回类型上。
doInBackground方法的返回类型和两个方法的params类型,onPostExecute将使用doInBackground方法的结果文件
private class myAsyncTask extends AsyncTask<File,Void,File>{
@Override
protected File doInBackground(File... voids) {
File f = capturePicture();
return f;
}
@Override
protected void onPostExecute(File f){
String rr = f.getAbsolutePath();
File g=new File(rr);
Toast.makeText(postSharingActivity.this,"onBloodyClick: "+g.toString(),Toast.LENGTH_LONG).show();
Uri uri = Uri.fromFile(g);
Toast.makeText(postSharingActivity.this,"URI :"+uri.toString(),Toast.LENGTH_LONG).show();
if(isStoragePermissionGranted()){
savedImage.setImageURI(uri);
cameraPreviewView.setVisibility(View.GONE);
postCaptureView.setVisibility(View.VISIBLE);
} else{
Toast.makeText(postSharingActivity.this,"error",Toast.LENGTH_LONG).show();
}
}
}
然后在 onClickListener 上指定顺序
capturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myAsyncTask task=new myAsyncTask();
task.doInBackground();
task.execute();
}
});