在我的应用程序中,我想用相机拍摄图像。为此,我使用以下代码开始一个新的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"返回代码,没有保存图片,传递给data
的{{1}}字段为空!(????)
问题肯定与我的文件有关,所以我改了。现在,当拍摄并保存照片时,相机应用程序会按预期返回" 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}到activity {com.example.testphoto / com.example.testphoto.MainActivity}:java.lang.NullPointerException"
有关导致这两个错误的原因的任何想法吗?
答案 0 :(得分:0)
试试这个:
File folder = new File(Environment.getExternalStorageDirectory().
getAbsolutePath()+ "/myfolder");
tempFolder.mkdir();
File myFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/myfolder", String.valueOf(System.currentTimeMillis()) + ".jpg");