捕捉图像

时间:2014-08-24 14:28:10

标签: android android-intent android-camera-intent

在我的应用程序中,我想用相机拍摄图像。为此,我使用以下代码开始一个新的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"

有关导致这两个错误的原因的任何想法吗?

1 个答案:

答案 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");

Source