2014-09-03 68 views
0

我正在捕获图像,然后在我的片段中的ImageView中显示它。我通过网络搜索这个,但我仍然无法完成。 以下是我正在做的事情。如何在片段中捕获图像Android

btnCaptureImg.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, 1888); 
    } 
}); 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.e("LOG", ""+requestCode); 
    if (requestCode == 1888 && resultCode == Activity.RESULT_OK) { 
     Bitmap photo = (Bitmap) data.getExtras().get("data"); 
     imageView.setImageBitmap(photo); 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 

Logcat说只有1888,但imageView没有加载图像。

我也试过这个

btnCaptureImg.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     File folder = new File(Environment.getExternalStorageDirectory().toString()+"/ImagesFolder/"); 
     folder.mkdirs(); 

     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     resultingFile = new File(folder.toString() + "/image.jpg"); 
     Uri uriSavedImage=Uri.fromFile(resultingFile); 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 

     startActivityForResult(cameraIntent, 1888); 
    } 
}); 

但它抛出异常:

E/AndroidRuntime(4824): java.lang.RuntimeException: Unable to resume activity {com.myapp.android/com.myapp.android.MyHomeActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=264032, result=-1, data=null} to activity {com.myapp.android/com.myapp.android.MyHomeActivity}: java.lang.NullPointerException 
E/AndroidRuntime(4824):  at com.myapp.android.MyFragment.onActivityResult(MyFragment.java:300) 
+0

考虑到'onActivityResult'不是在'Fragment'中调用的,而是在'Activity'中调用的。 – 2014-09-03 08:57:51

+0

那么我怎样才能实现我的目标,即拍摄照片并使用片段将其显示到ImageView?可能吗? – kads 2014-09-03 09:17:02

回答

0

尝试把

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, your_image_uri); 

在此之前

startActivityForResult(cameraIntent, 1888); 

对不起队友,但我似乎无法理解为什么它给那个例外。尝试这种方法,它适用于我。

定义文件,并在全球范围内onActivityResult

if (requestCode == 1888 && resultCode == Activity.RESULT_OK) { 
     Bitmap photo = Media.getBitmap(getActivity().getContentResolver(), Uri.fromFile(resultingFile)); 
     //Bitmap photo = (Bitmap) data.getExtras().get("data"); 
     imageView.setImageBitmap(photo); 
    } 
+0

我已经做了这个[link](http://stackoverflow.com/questions/14187146/emulator-crashes-when-capturing-a-photo-nullpointerexception)已经声明。但它引发了一个异常。看到我更新的问题。 – kads 2014-09-03 09:15:03

+0

'MyFragment.java'代码块是什么:300' – 2014-09-03 09:29:07

+0

位图photo =(位图)data.getExtras()。get(“data”); – kads 2014-09-03 09:31:01

0

首先,在片段开始的意图捕捉图像:

private void startIntentImageCapture() { 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    try { 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile("imageName.jpg", ".jpg", storageDir); 
     path = Uri.fromFile(image); 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, path); 
     getActivity().startActivityForResult(cameraIntent, CAPTURE_IMAGE_REQUEST_CODE); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

path变量,必须是一个公共静态Uri实例。而对于请求代码中的另一个公共静态Integerpublic static final Integer CAPTURE_IMAGE_REQUEST_CODE = 100;

然后在Activity,阅读这条道路和解码图像:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == YourFragment.CAPTURE_IMAGE_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       Bitmap imageBitmap = decodeFile(YourFragment.path); 
       //do something with your photo 
      } 
     } 
    } 

我敢肯定,这是不是最好的和更清洁的方法,但它的工作原理为了我。希望能帮助到你!

EDIT

我忘了代码的图像进行解码。

public Bitmap decodeFile(Uri uriFile) throws OutOfMemoryError { 
     String filePath = uriFile.getPath(); 
     BitmapFactory.Options bmOptions; 
     Bitmap imageBitmap; 
     try { 
      imageBitmap = BitmapFactory.decodeFile(filePath); 
     } catch (OutOfMemoryError e) { 
      bmOptions = new BitmapFactory.Options(); 
      bmOptions.inSampleSize = 4; 
      bmOptions.inPurgeable = true; 
      imageBitmap = BitmapFactory.decodeFile(filePath, bmOptions); 
     } 
     return imageBitmap; 
    } 

bmOptions确保不会发生OutOfMemoryError。

相关问题