2014-09-03 67 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。

相關問題