使用ACTION_IMAGE_CAPTURE访问摄像机

时间:2012-07-21 10:04:14

标签: android android-intent android-camera

我要做的是创建一个新文件夹并将相机捕获的图像保存在该文件夹中。我正在尝试使用以下snipet实现它:

public class DocsAdd extends Activity
{   
    private static int TAKE_PICTURE = 1;
    private Uri outputFileUri;
    Bitmap thumbnail;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        File filename;
        try 
        {
            long currentTime = System.currentTimeMillis();
            String fileName = "img" + currentTime+".jpg";
            String path = Environment.getExternalStorageDirectory().toString();             
            filename = new File(path + "/AutoistDiary/"+ fileName);
            FileOutputStream out = new FileOutputStream(filename);            
            out.flush();
            out.close();     
            MediaStore.Images.Media.insertImage(getContentResolver(),filename.getAbsolutePath(), filename.getName(), filename.getName());

          outputFileUri = Uri.fromFile(filename);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, TAKE_PICTURE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        if (requestCode == TAKE_PICTURE)
        {
            Uri imageUri = null;            
            if (data!=null) 
            {
                if (data.hasExtra("data")) 
                {
                    thumbnail = data.getParcelableExtra("data");
                    Intent docsShow_intent=new Intent(this,DocsShow.class);
                    startActivity(docsShow_intent);
                }
            } 
            else 
            {
            }

        }  
    }
}

但是当我在Optimus1上运行它时,它没有将任何结果返回到我的活动,遇到链接Camera on Android Example,其中指出了我目前面临的同样问题,因此可以帮助我解决这个问题。 ?

1 个答案:

答案 0 :(得分:4)

不幸的是,某些设备上存在一个错误,导致Intend data中的onActivityResult参数在您对摄像头的意图中使用MediaStore.EXTRA_OUTPUT标志时为空。解决方法是将outputFileUri变量保持为全局变量,以便您可以使用onActivityResult方法再次访问它。像这样:

Uri outputFileUri; //global variable

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo= new File(Environment.getExternalStorageDirectory(), "Autoist Diary"); 

if (! photo.exists())  
{  
    photo.mkdirs();  
    if (! photo.mkdirs())  
    {  
        Log.i("MyCameraApp", "failed to create directory");  
    }  
}  
puc_img=new File(photo,"Puc_Img.jpg");  
outputFileUri = Uri.fromFile(photo);  
intent.putExtra(MediaStore.EXTRA_OUTPUT,outputFileUri);  
StartActivityForResult(intent, TAKE_PICTURE);  

public void onActivityResult(int requestCode, int resultCode, Intent data)  
{  
    super.onActivityResult(requestCode, resultCode, data);  
    switch (requestCode)   
    {  
       case TAKE_PICTURE:  
           if (resultCode == Activity.RESULT_OK)   
           {                   
               if(data != null) { //if the intent data is not null, use it
                  puc_image = getImagePath(Uri.parse(data.toURI())); //update the image path accordingly
                  StoreImage(this,Uri.parse(data.toURI()),puc_img);
               }
               else { //Use the outputFileUri global variable
                  StoreImage(this,outputFileUri,puc_img);
               }
           }   
       break;
    }  
}  
public static void StoreImage(Context mContext, Uri imageLoc, File imageDir)  
{  
    Bitmap bm = null;  
    try   
    {  
        bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);  
        FileOutputStream out = new FileOutputStream(imageDir);  
        bm.compress(Bitmap.CompressFormat.JPEG, 100, out);  
        bm.recycle();  
    }  
    catch (FileNotFoundException e)   
    {  
        e.printStackTrace();  
    }  
    catch (IOException e)   
    {  
       e.printStackTrace();  
    }  
    catch (Exception e)   
    {  
        e.printStackTrace();  
    }  
}
public String getImagePath(Uri uri) {
    String selectedImagePath;
    // 1:MEDIA GALLERY --- query from MediaStore.Images.Media.DATA
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if (cursor != null) {
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        selectedImagePath = cursor.getString(column_index);
    } else {
        selectedImagePath = null;
    }

    if (selectedImagePath == null) {
        // 2:OI FILE Manager --- call method: uri.getPath()
        selectedImagePath = uri.getPath();
    }
    return selectedImagePath;
}

这个workaroud对我有用。希望有所帮助。