2013-03-06 24 views
16

Tôi có một hoạt động trong đó tôi cung cấp cho người dùng tùy chọn nhấp vào hình ảnh từ máy ảnh, sau đó tôi lưu trữ hình ảnh này trong một mảng byte và trong Cơ sở dữ liệu. Tuy nhiên mã của tôi dường như không làm việc trên Samsung Galaxy S3 dưới đây là các mã:Mục đích của máy ảnh không hoạt động với Samsung Galaxy S3

Máy ảnh kêu gọi ý:

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

On phương pháp Hoạt động cho máy ảnh:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1337 && resultCode == RESULT_OK) { 
     Bundle extras = data.getExtras(); 
     if (extras != null) { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      thumbnail = (Bitmap) extras.get("data"); 
      image(thumbnail); 
     } else { 
      Toast.makeText(CreateProfile.this, "Picture NOt taken", Toast.LENGTH_LONG).show(); 
     } 

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

Hình ảnh của tôi (Bitmap thumbnail) function:

public void image(Bitmap thumbnail) { 
    Bitmap photo = thumbnail; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    photo.compress(Bitmap.CompressFormat.PNG, 100, bos); 
    b = bos.toByteArray(); 
    ImageView imageview = (ImageView)findViewById(R.id.imageView1); 
    Bitmap bt = Bitmap.createScaledBitmap(photo, 100, 80, false); 
    imageview.setImageBitmap(bt); 
} 

Tuy nhiên điều này không hoạt động với Samsung S3, tôi đã thay đổi c ode sau đây và bây giờ nó hoạt động với Samsung S3, tuy nhiên nó không hoạt động với bất kỳ thiết bị nào khác.

Máy ảnh Ý định:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

Hoạt động cho kết quả:

startActivityForResult(intent, CAMERA_IMAGE_CAPTURE); 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CAMERA_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { 
     // Describe the columns you'd like to have returned. Selecting from the Thumbnails location gives you both the Thumbnail Image ID, as well as the original image ID 
String[] projection = { 
MediaStore.Images.Thumbnails._ID, // The columns we want 
MediaStore.Images.Thumbnails.IMAGE_ID, 
MediaStore.Images.Thumbnails.KIND, 
MediaStore.Images.Thumbnails.DATA}; 
String selection = MediaStore.Images.Thumbnails.KIND + "=" + // Select only mini's 
MediaStore.Images.Thumbnails.MINI_KIND; 

String sort = MediaStore.Images.Thumbnails._ID + " DESC"; 

//At the moment, this is a bit of a hack, as I'm returning ALL images, and just taking the latest one. There is a better way to narrow this down I think with a WHERE clause which is currently the selection variable 
Cursor myCursor = this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, null, sort); 

long imageId = 0l; 
long thumbnailImageId = 0l; 
String thumbnailPath = ""; 

try{ 
myCursor.moveToFirst(); 
imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID)); 
thumbnailImageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID)); 
thumbnailPath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
} 
finally{myCursor.close();} 

//Create new Cursor to obtain the file Path for the large image 

String[] largeFileProjection = { 
MediaStore.Images.ImageColumns._ID, 
MediaStore.Images.ImageColumns.DATA 
}; 

String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; 
myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); 
String largeImagePath = ""; 

try{ 
myCursor.moveToFirst(); 

//This will actually give yo uthe file path location of the image. 
largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); 
} 
finally{myCursor.close();} 
// These are the two URI's you'll be interested in. They give you a handle to the actual images 
Uri uriLargeImage = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(imageId)); 
Uri uriThumbnailImage = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, String.valueOf(thumbnailImageId)); 

// I've left out the remaining code, as all I do is assign the URI's to my own objects anyways... 
// Toast.makeText(this, ""+largeImagePath, Toast.LENGTH_LONG).show(); 
// Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); 
// Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); 

    if (largeImagePath != null) { 
     // Toast.makeText(this, "" + largeImagePath, Toast.LENGTH_LONG).show(); 

     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inSampleSize = OG; 
     // thumbnail = (BitmapFactory.decodeFile(picturePath)); 
     thumbnail = BitmapFactory.decodeFile((largeImagePath), opts); 
     System.gc(); 
     if (thumbnail != null) { 
      Toast.makeText(this, "Success", Toast.LENGTH_LONG).show(); 
     } 

     image(thumbnail); 

    } 

    if (uriLargeImage != null) { 
     Toast.makeText(this, "" + uriLargeImage, Toast.LENGTH_LONG).show(); 
    } 

    if (uriThumbnailImage != null) { 
     Toast.makeText(this, "" + uriThumbnailImage, Toast.LENGTH_LONG).show(); 
    } 
} 

Đây là hình ảnh của tôi() chức năng:

public void image(Bitmap thumbnail) { 
    b = null; 

    Bitmap photo = thumbnail; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    photo.compress(Bitmap.CompressFormat.PNG, 100, bos); 
    b = bos.toByteArray(); 

    if (b != null) { 
     Toast.makeText(this, "Success Yeah" + b, Toast.LENGTH_LONG).show(); 
    } 
} 

Trong khi như tất cả các ba 1) uriLargeImage 2) largeImagePath 3) uriThumbnailImage trả lại cho tôi đường dẫn hoặc URI Tôi không thể thiết lập bitmap đã tạo cho ImageView của mình. Tuy nhiên đây là trường hợp chỉ với Samsung S3, nếu tôi chạy đoạn mã đã chỉnh sửa ở trên với bất kỳ thiết bị nào khác, chương trình sẽ bị treo.

Trong manifest Tôi đã sử dụng

android:configChanges="keyboardHidden|orientation" 

Dựa trên hướng dẫn: http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

Tuy nhiên nếu tôi chụp ảnh trong chế độ phong cảnh, mọi thứ hoạt động tốt! Tôi bị bối rối!! (Trong Samsung S3)

+0

tôi đã gặp phải sự cố tương tự với thiết bị cụ thể này. tôi đã giải quyết vấn đề này sau nhiều thử nghiệm và lỗi metho. bạn có thể có ý tưởng tốt hơn về vấn đề này từ [ở đây] (http://stackoverflow.com/questions/14495304/camera-force-closing-issue-in-samsung-galaxy-s3-version-4-1-1/14640678 # 14640678) –

+0

Các tham chiếu trên là cùng một người bạn đời, tôi đã tham khảo từ cùng một hướng dẫn, trong khi mọi thứ dường như làm việc tốt vấn đề duy nhất là tôi mất dữ liệu ở đâu đó không nên xảy ra với khai báo kê khai. – Skynet

+0

bạn có phiền khi liên kết dự án của mình không? Tôi sẽ không bận tâm kiểm tra một số công cụ. –

Trả lời

16

Cuối cùng sau khi đấu tranh trong ba ngày, tôi đã nghĩ ra một cơ chế đơn giản để vượt qua Samsung S3 Saga.

Dưới đây là mã, tóm tắt nhanh mã là lần đầu tiên tôi kiểm tra Nhà sản xuất thiết bị và dựa trên điều này tôi gọi các ý định khác nhau cho máy ảnh.

public class MainActivity extends Activity { 

    private static int RESULT_LOAD_IMAGE = 1; 
    private static final int PICK_FROM_GALLERY = 2; 
    int CAMERA_PIC_REQUEST = 1337; 
    Bitmap thumbnail = null; 
    private static final int OG = 4; 

    private static final int CAMERA_IMAGE_CAPTURE = 0; 
    Uri u; 
    ImageView imgview; 
    // int z=0; 
    String z = null; 
    byte b[]; 
    String largeImagePath = ""; 
    Uri uriLargeImage; 
    Uri uriThumbnailImage; 
    Cursor myCursor; 

    public void imageCam(Bitmap thumbnail) { 
     Bitmap photo = thumbnail; 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     photo.compress(Bitmap.CompressFormat.JPEG, 70, bos); 
     b = bos.toByteArray(); 
     ImageView imageview = (ImageView) findViewById(R.id.imageView1); 
     imageview.setImageBitmap(photo); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button bt = (Button) findViewById(R.id.button1); 
     bt.setOnClickListener(onBTN); 
     if (savedInstanceState != null) { 

      Bitmap Zatang; 
      String B1 = savedInstanceState.getString("message"); 
      Toast.makeText(this, "SavedYeah" + B1, Toast.LENGTH_LONG).show(); 
      BitmapFactory.Options opts = new BitmapFactory.Options(); 
      opts.inSampleSize = OG; 
      Zatang = BitmapFactory.decodeFile((B1), opts); 
      System.gc(); 
      if (Zatang != null) { 
       Toast.makeText(this, "Success Zatang" + B1, Toast.LENGTH_LONG) 
       .show(); 
       imageCam(Zatang); 
      } 
     } 
    } 

    private View.OnClickListener onBTN = new View.OnClickListener() { 
     public void onClick(View v) { 
      openNewGameDialog(); 
     } 
    }; 

    String[] B = { "Cam", "Gallery" }; 

    private void openNewGameDialog() { 
     new AlertDialog.Builder(this).setItems(B,new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialoginterface,int i) { 
       if (i == 0) { 
        String BX1 = android.os.Build.MANUFACTURER; 

        if(BX1.equalsIgnoreCase("samsung")) { 
         Toast.makeText(getApplicationContext(), "Device man"+BX1, Toast.LENGTH_LONG).show(); 
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(intent, CAMERA_IMAGE_CAPTURE); 

        } else { 
         Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
        } 
       } else if (i == 1) { 
        Intent intent = new Intent(Intent.ACTION_PICK); 
        intent.setType("image/*"); 
        startActivityForResult(intent, RESULT_LOAD_IMAGE); 
       } 
      }).show(); 
     } 

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if(requestCode==CAMERA_IMAGE_CAPTURE && resultCode==Activity.RESULT_OK){ 

       // Describe the columns you'd like to have returned. Selecting from the Thumbnails location gives you both the Thumbnail Image ID, as well as the original image ID 
       String[] projection = { 
         MediaStore.Images.Thumbnails._ID, // The columns we want 
         MediaStore.Images.Thumbnails.IMAGE_ID, 
         MediaStore.Images.Thumbnails.KIND, 
         MediaStore.Images.Thumbnails.DATA}; 
       String selection = MediaStore.Images.Thumbnails.KIND + "=" + // Select only mini's 
         MediaStore.Images.Thumbnails.MINI_KIND; 

       String sort = MediaStore.Images.Thumbnails._ID + " DESC"; 

       //At the moment, this is a bit of a hack, as I'm returning ALL images, and just taking the latest one. There is a better way to narrow this down I think with a WHERE clause which is currently the selection variable 
       myCursor = this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, null, sort); 

       long imageId = 0l; 
       long thumbnailImageId = 0l; 
       String thumbnailPath = ""; 

       try { 
        myCursor.moveToFirst(); 
        imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID)); 
        thumbnailImageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID)); 
        thumbnailPath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
       } finally { 
        myCursor.close(); 
       } 

       //Create new Cursor to obtain the file Path for the large image 

       String[] largeFileProjection = { 
         MediaStore.Images.ImageColumns._ID, 
         MediaStore.Images.ImageColumns.DATA 
       }; 

       String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; 
       myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); 
       largeImagePath = ""; 

       try { 
        myCursor.moveToFirst(); 

        //This will actually give yo uthe file path location of the image. 
        largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); 
       } finally { 
        myCursor.close(); 
       } 
       // These are the two URI's you'll be interested in. They give you a handle to the actual images 
       uriLargeImage = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(imageId)); 
       uriThumbnailImage = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, String.valueOf(thumbnailImageId)); 

       // I've left out the remaining code, as all I do is assign the URI's to my own objects anyways... 
       // Toast.makeText(this, ""+largeImagePath, Toast.LENGTH_LONG).show(); 
       // Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); 
       // Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); 


       if (largeImagePath != null) { 
        Toast.makeText(this, "LARGE YES"+largeImagePath, Toast.LENGTH_LONG).show(); 

        BitmapFactory.Options opts = new BitmapFactory.Options(); 
        opts.inSampleSize = OG; 
        thumbnail = BitmapFactory.decodeFile((largeImagePath), opts); 
        System.gc(); 
        if (thumbnail != null) { 
         Toast.makeText(this, "Try Without Saved Instance", Toast.LENGTH_LONG).show(); 
         imageCam(thumbnail); 
        } 
       } 
       if (uriLargeImage != null) { 
        Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); 
       } 
       if (uriThumbnailImage != null) { 
        Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); 
       } 
      } 
      if(requestCode == 1337 && resultCode== RESULT_OK){ 
       Bundle extras = data.getExtras(); 
       if (extras.keySet().contains("data")){ 
        BitmapFactory.Options options = new BitmapFactory.Options(); 
        thumbnail = (Bitmap) extras.get("data"); 
        if (thumbnail != null) { 
         Toast.makeText(this, "YES Thumbnail", Toast.LENGTH_LONG).show(); 
         BitmapFactory.Options opt = new BitmapFactory.Options(); 
         thumbnail = (Bitmap) extras.get("data"); 
         imageCam(thumbnail); 
        } 
       } else { 
        Uri imageURI = getIntent().getData(); 
        ImageView imageview = (ImageView)findViewById(R.id.imageView1); 
        imageview.setImageURI(imageURI); 

        if(imageURI != null){ 
         Toast.makeText(this, "YES Image Uri", Toast.LENGTH_LONG).show(); 
        } 
       } 
       super.onActivityResult(requestCode, resultCode, data); 
      } 
      if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
       Uri selectedImage = data.getData(); 

       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
       Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String picturePath = cursor.getString(columnIndex); 
       cursor.close(); 
       BitmapFactory.Options opts = new BitmapFactory.Options(); 
       thumbnail = BitmapFactory.decodeFile((picturePath), opts); 
       System.gc(); 
       imageCam(thumbnail);    
      } 
     } 
     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putString("message",largeImagePath); 
     } 

    } 
} 
+0

Kính gửi, cảm ơn bạn chia sẻ giải pháp của bạn !! Tùy thuộc vào bạn! – Mateus

+0

Bạn chào mừng bạn đời :) – Skynet

+0

Hoạt động tốt với Samsung Galaxy S3. Nhưng không phải cho tất cả các thiết bị Samsung. – redestructa

Các vấn đề liên quan