2012-09-01 83 views
8

我正在嘗試簡單地拍攝一張照片,並將其以三星Galaxy S的形式呈現在ImageView中。當我在風景上做它時,它工作正常,但在肖像上不是。我沒有得到任何錯誤或例外 - 只是沒有得到任何東西......關於這個話題有很多問題,它似乎有問題(關於相機方向的東西),但沒有找出最終的解決方案,爲一個簡單的「拍照並呈現它「的代碼。 這裏是我的(問題)的代碼,不工作:在三星Galaxy S上以「縱向模式拍攝照片並呈現」

private void setUpListeners() { 
    takePicture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Intent cameraIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
     } 
    }); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
     if (requestCode == CAMERA_PIC_REQUEST) { 
      Log.d("onActivityResult", "CAMERA_PIC_REQUEST returned"); 
      dishImage = (Bitmap) data.getExtras().get("data"); 
      if (dishImage==null) 
       Log.d("onActivityResult", "dishImage==null"); 
      imageView = (ImageView) findViewById(R.id.dishinfodishimageview); 
      imageView.setImageBitmap(dishImage); 
      imageView.setVisibility(View.VISIBLE); 
      takePicture.setVisibility(View.GONE); 
      (new UploadImage()).execute(null); 
     } 
    } else { 
     Log.e("onActivityResult", 
       "no able to presenting the picture of the dish"); 
    } 

}

我只是需要一個工作(任何設備)代碼或修正我的代碼...... THX。

+0

看到這個老[answer](http://stackoverflow.com/a/11084765/1250370)。它可能會幫助你。 :) – Deepak

+0

旋轉你的位圖圖像參考這[鏈接](http://stackoverflow.com/a/6051340/1250370) – Deepak

+0

我仍然不明白:在縱向我沒有得到一個旋轉的圖片。 ..我根本沒有得到一張照片......並且沒有出現錯誤或異常......它似乎在跳過這一行imageView.setImageBitmap(dishImage);(但在風景中它正在工作......) – yehudahs

回答

1

我只能提出這個問題的破解。將您的結果保存在onActivityResult()的共享偏好設置中,並在onCreate期間從共享偏好設置中加載您的內容。我知道這是一個不好的解決方案,但這會讓你繼續前進,直到找到更好的答案。一旦完成,不要忘記清除您的共享偏好,否則您的活動將始終使用舊數據進行初始化。

2

調用onCreate()的原因是因爲當您在縱向定位過程中調用相機活動時,它會改變方向並破壞以前的活動。完成onActivityResult()後,您的活動將被重新創建。

一個解決這個問題是要設置明顯的忽略與方向的變化而變化,您可以使用此做:

<activity android:name=".MyMainActivity" 
    android:configChanges="orientation" 
    android:label="@string/app_name" /> 

如果使用的是API 13級開始,你可以考慮screenSize爲configChanges清單。

1

試試下面的代碼..它爲我工作與三星Galaxy S2將下面的代碼在onActivityResult()

ExifInterface exif = new ExifInterface(cameraimagename); 
        String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 
        int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; 
        int rotationAngle = 0; 
        System.out.println("orientation is : "+orientation); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_90 : "+ExifInterface.ORIENTATION_ROTATE_90); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_180 : "+ExifInterface.ORIENTATION_ROTATE_180); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_270 : "+ExifInterface.ORIENTATION_ROTATE_270); 

        if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; 
        if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; 
        if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; 
        System.out.println("Rotation Angle is : "+rotationAngle); 
        Matrix matrix = new Matrix(); 
        // matrix.setRotate(rotationAngle, (float) photo.getWidth()/2, (float) photo.getHeight()/2); 
        matrix.postRotate(rotationAngle); 

        Bitmap rotatedBitmap=null; 
        try { 
         rotatedBitmap = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
+0

cameraimagename =圖像的路徑(String)和Photo是前面生成的位圖對象 –

+0

我試過類似的代碼,它對我來說一直很慢,你遇到同樣的問題嗎? –

+0

沒有@Helin Wang它完美地在我的Galaxy S2設備上工作 –

0

可以很容易地檢測圖像的方向和使用替換位圖:

/** 
* Rotate an image if required. 
* @param img 
* @param selectedImage 
* @return 
*/ 
private static Bitmap rotateImageIfRequired(Context context,Bitmap img, Uri selectedImage) { 

    // Detect rotation 
    int rotation=getRotation(context, selectedImage); 
    if(rotation!=0){ 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(rotation); 
     Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); 
     img.recycle(); 
     return rotatedImg;   
    }else{ 
     return img; 
    } 
} 

/** 
* Get the rotation of the last image added. 
* @param context 
* @param selectedImage 
* @return 
*/ 
private static int getRotation(Context context,Uri selectedImage) { 
    int rotation =0; 
    ContentResolver content = context.getContentResolver(); 


    Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[] { "orientation", "date_added" },null, null,"date_added desc"); 

    if (mediaCursor != null && mediaCursor.getCount() !=0) { 
     while(mediaCursor.moveToNext()){ 
      rotation = mediaCursor.getInt(0); 
      break; 
     } 
    } 
    mediaCursor.close(); 
    return rotation; 
} 

爲了避免出的大圖像的記憶,我建議你使用重新縮放圖像:

private static final int MAX_HEIGHT = 1024; 
private static final int MAX_WIDTH = 1024; 
public static Bitmap decodeSampledBitmap(Context context, Uri selectedImage) 
     throws IOException { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    InputStream imageStream = context.getContentResolver().openInputStream(selectedImage); 
    BitmapFactory.decodeStream(imageStream, null, options); 
    imageStream.close(); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, MAX_WIDTH, MAX_HEIGHT); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    imageStream = context.getContentResolver().openInputStream(selectedImage); 
    Bitmap img = BitmapFactory.decodeStream(imageStream, null, options); 

    img= rotateImageIfRequired(img, selectedImage); 
    return img; 
} 

使用ExifInterface獲取方向是不可能的,因爲Android操作系統問題: https://code.google.com/p/android/issues/detail?id=19268

相關問題