【发布时间】:2014-08-24 14:28:09
【问题描述】:
在我的应用程序中,我想用相机捕捉图像。为此,我使用以下代码创建了一个新的Activity:
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(myFile));
startActivityForResult(intent,100);
为了在拍照时得到提醒,我实现了onActivityResult 函数。我希望在用户拍照后(或在他取消操作后)启动此功能,但它会在StartActivityForResult 调用后立即启动,结果代码设置为RESULT_CANCELED。从用户的角度来看,一切似乎都很正常:相机应用程序启动并且可以拍照。完成后,应用程序会询问是否必须保存图片,并在回答问题后继续我的应用程序。
知道为什么onActivityResult 函数会立即以RESULT_CANCELED 返回码启动,而不是在拍摄照片时以RESULT_OK 返回码启动吗?
为了继续调查,我使用以下代码创建了一个新的简单应用程序:
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
if(id==R.id.Photo){
AlertDialog.Builder builder;
View view;
builder=new AlertDialog.Builder(this);
view=getLayoutInflater().inflate(R.layout.dialog_box,null);
builder.setView(view);
builder.setPositiveButton("OK",new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
((Button)vue.findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
File file,directory;
Intent intent;
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
directory= new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test");;
if (!directory.exists()){
if (!directory.mkdirs()){
file= null;
}
}
file= new File(directory.getPath()+File.separator+"temp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,100);
}
});
constructeur.create().show();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==100){
if (resultCode== RESULT_OK) {
Toast.makeText(this,"Image saved "+data.getData().getPath(),Toast.LENGTH_LONG).show();
}
}
}
}
图片应用程序通过单击对话框中的按钮启动。这一次,当退出相机应用程序时,onActivityResult 正确启动,但出现了另一个问题:尽管返回代码为“RESULT_OK”,但没有保存图片并且传递给onActivityResult 的data 字段为空!( ????)
问题肯定与我的文件有关,所以我更改了它。现在,当拍摄并保存照片时,相机应用程序按预期返回“RESULT_OK”,但onActivityResult stll 接收到空数据。图片已正确保存在指定文件中。
在日志文件中,我收到两个错误:
“活动 com.example.testphoto.MainActivity 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindows$DecorView”
和
"java.lang.RuntimeException : 无法恢复活动 {com.example.testphoto/com.example.testphoto.MainActivity} : java.lang.RuntimeException : 传递结果失败 ResultInfo{who=null,request=100, result =-1,data=null} 到活动 {com.example.testphoto/com.example.testphoto.MainActivity}:java.lang.NullPointerException"
知道导致这两个错误的原因吗?
【问题讨论】:
-
myFile存在吗?你是用真机测试吗? -
myFile不存在,因为我希望它由相机应用程序创建。是的,我使用的是真实设备。
标签: android android-intent android-camera-intent