android - 如何使用相机从SD卡获取图像

时间:2011-10-20 07:09:11

标签: java android android-camera

我在该应用程序中实现了一个应用程序,其中有一个按钮。如果你点击那个按钮,那么相机就会被打开,你可以抓住一些东西。捕获的图像将显示在应用程序中。

但现在我想再添加一个按钮。如果单击它,则会在网格视图中显示SD卡中的所有图像(相机相关图像)。如果选择任何图像,则它将显示在应用程序中。

请任何人建议我如何实施它。

还有一件事。在此代码中

Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  

这里“数据”意味着什么?

代码:

public class camera extends Activity 
    {

Button camera_btn;
ImageView cap_image;
public static final int CAMERA_PIC_REQUEST = 1;  

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    camera_btn = (Button) findViewById(R.id.camera_btn);
    camera_btn.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
        }

    });

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{  
    if (requestCode == CAMERA_PIC_REQUEST)
    {  
        if(data != null)
        {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  
            cap_image = (ImageView) findViewById(R.id.cap_image);
            cap_image.setImageBitmap(thumbnail); 
        }
        else
        {
            System.out.println("Please capature the photo");
        }

    }  
}  
}

例外: 的 10-20 13:06:35.073:WARN / System.err(5391):java.lang.IllegalArgumentException:没有通过Activity#showDialog

显示没有ID为10020的对话框

10-20 13:06:35.073:WARN / System.err(5391):在android.app.Activity.missingDialog(Activity.java:2747)

10-20 13:06:35.073:WARN / System.err(5391):在android.app.Activity.dismissDialog(Activity.java:2732)

10-20 13:06:35.083:WARN / System.err(5391):at com.htc.album.TabPluginDevice.ActivityGlanceBase.handleActivityMessage(ActivityGlanceBase.java:161)

10-20 13:06:35.083:WARN / System.err(5391):at com.htc.opensense.album.TemplateActivityBase $ ActivityHandler.handleMessage(TemplateActivityBase.java:89) 10-20 13:06:35.083:WARN / System.err(5391):在android.os.Handler.dispatchMessage(Handler.java:99)

10-20 13:06:35.083:WARN / System.err(5391):在android.os.Looper.loop(Looper.java:143)

10-20 13:06:35.083:WARN / System.err(5391):在android.app.ActivityThread.main(ActivityThread.java:4277)

10-20 13:06:35.093:WARN / System.err(5391):at java.lang.reflect.Method.invokeNative(Native Method)

10-20 13:06:35.093:WARN / System.err(5391):at java.lang.reflect.Method.invoke(Method.java:507)

10-20 13:06:35.093:WARN / System.err(5391):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)

10-20 13:06:35.093:WARN / System.err(5391):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

10-20 13:06:35.093:WARN / System.err(5391):at dalvik.system.NativeStart.main(Native Method)

10-20 13:06:38.523:INFO / LogFilter(726):找不到必需的“主机”HTTP标头。

2 个答案:

答案 0 :(得分:1)

    camera_btn.setOnClickListener(new OnClickListener(){ 

        @Override 
        public void onClick(View v) { 

            Intent cameraIntent = new Intent(Intent.ACTION_GET_CONTENT);
            cameraIntent.setType("image/*");
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);  
        } 

    }); 

protected void onActivityResult(int requestCode, int resultCode, Intent data)  
{   
    if (requestCode == CAMERA_PIC_REQUEST && resultCode==Activity.RESULT_OK) 
    {   
        if(data != null) 
        { 
        Uri contentUri = data.getData();
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String tmppath = cursor.getString(column_index);
        Bitmap bmp = BitmapFactory.decodeFile(tmppath);            } 
        else 
        { 
            System.out.println("Please capature the photo"); 
        } 

    }   
}   

Here "data" means what?

没有太多的概念知识,但您可以将数据视为您为结果启动的活动的输出..这是您的情况下的图像..也可以是视频或其他任何取决于您开始的活动哪个行动。

答案 1 :(得分:0)

@Frankenstein:整个过程是正确的,除了以下代码

位图缩略图=(位图)data.getExtras()。get(“data”);

而不是这样做,请执行以下过程

  1. 从意图中获取URI。

    Uri selectedImageUri = data.getData();

  2. 从URI获取路径

    String filestring = selectedImageUri.getPath();

  3. 使用getThumbnail(ContentResolver cr,long origId,int kind,BitmapFactory.Options选项)方法获取位图

  4. 位图缩略图= MediaStore.Images.Thumbnails.getThumbnail(                         getContentResolver(),selectedImageUriId,                         MediaStore.Images.Thumbnails.MINI_KIND,                         (BitmapFactory.Options)null);

    此处 getContentResolver() ---->返回应用程序包的ContentResolver实例。         selectedImageUriId ---->所选缩略图的ID。 这将从路径开始。

    Ex:路径:/ external / images / media / 5 这里“5”是所选图像的ID。这个“5”来自使用字符串操作的路径。

    最后是以下代码而不是

    Code
    

    //从意图中获取URI

    Uri selectedImageUri = data.getData();

    //从URI获取解码路径

    String filestring = selectedImageUri.getPath();

    //从路径中获取ID。 String x = filestring.substring(23);

    long selectedImageUriId = Long.parseLong(x);

    //获取位图

    位图缩略图= MediaStore.Images.Thumbnails.getThumbnail(                         getContentResolver(),selectedImageUriId,                         MediaStore.Images.Thumbnails.MINI_KIND,                         (BitmapFactory.Options)null);