【问题标题】:Capturing an image捕获图像
【发布时间】: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”,但没有保存图片并且传递给onActivityResultdata 字段为空!( ????)

问题肯定与我的文件有关,所以我更改了它。现在,当拍摄并保存照片时,相机应用程序按预期返回“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


【解决方案1】:

试试这个:

File folder = new File(Environment.getExternalStorageDirectory().
        getAbsolutePath()+ "/myfolder");
tempFolder.mkdir();

File myFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
        + "/myfolder", String.valueOf(System.currentTimeMillis()) + ".jpg");

Source

【讨论】:

  • 我已经有类似的台词了。不同的是,我的File位于图片专用的外部存储公共目录中。我可以补充一点,如果我确认我想要存储我的图片,它会被正确记录在意图的额外内容中指定的位置。
  • @VD63 你设置了外部存储权限了吗?
  • 是的,我已经声明了android.permission.WRITE_EXTERNAL_STORAGEpermission。
  • 我已经修改了我的问题以包含有关我所做工作的更多信息。
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2015-12-21
  • 2012-01-06
  • 2014-04-03
  • 2010-12-21
  • 2015-07-18
相关资源
最近更新 更多