android solucionar La intención de la cámara no funciona con Samsung Galaxy S3




porque no funciona la camara de mi celular android (2)

Above ans with some correction for normal samsung device and orientaton issue problem


private void cameraIntent() {
        new AlertDialog.Builder(this).setItems(B,new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialoginterface,int i) {
                if (i == 0) {

                    String manufacturer_Type =  android.os.Build.MANUFACTURER;

                    if(manufacturer_Type.equalsIgnoreCase("samsung")) {
                        Toast.makeText(getApplicationContext(), "Device man"+manufacturer_Type, 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 = CameraActivity.this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, null, sort);

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

            try {
                int cursor_size = myCursor.getCount();
                if(cursor_size>0){
                    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));
                    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";
                    Cursor mCursor = CameraActivity.this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort);
                    largeImagePath = "";

                    try {
                        mCursor.moveToFirst();

                        //This will actually give you the file path location of the image.
                        largeImagePath = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
                    }finally{
                        mCursor.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();
                            Bitmap rotatedImage = exifImage(thumbnail, largeImagePath);
                            //                        imageCam(thumbnail);

                            if(imageview!=null){
                                imageview.setImageBitmap(rotatedImage);
                            }
                        }
                    }
                    if (uriLargeImage != null) {
                        Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show();
                    }
                    if (uriThumbnailImage != null) {
                        Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show();
                    }
                }else{
                    requestCode=CAMERA_SAMSUNG_NORMAL_PIC_REQUEST;
                    normalDeviceCamera(requestCode, resultCode, data);
                }
            } catch(Exception e){
                e.printStackTrace();

            }finally {
                if(!myCursor.isClosed()){
                    myCursor.close();
                }
            }


        }
        if( requestCode == CAMERA_PIC_REQUEST && resultCode== RESULT_OK){
            normalDeviceCamera(requestCode, resultCode, data);
        }

    }

    private void normalDeviceCamera(int requestCode, int resultCode, Intent data){
        if( requestCode == CAMERA_PIC_REQUEST && resultCode== RESULT_OK){
            Bundle extras = data.getExtras();
            if (extras.keySet().contain`enter code here`s("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");

                    if(imageview!=null){
                        imageview.setImageBitmap(thumbnail);
                    }
                }
            } else {
                Uri imageURI = getIntent().getData();
                //                ImageView imageview = (ImageView)findViewById(R.id.imgCam);
                if(imageview!=null){
                    imageview.setImageURI(imageURI);
                }
                if(imageURI != null){
                    Toast.makeText(this, "YES Image Uri", Toast.LENGTH_LONG).show();
                }
            }
            super.onActivityResult(requestCode, resultCode, data);  
        }
    }

Tengo una actividad en la que le doy al usuario la opción de hacer clic en una imagen de la cámara, luego la almaceno en una matriz de bytes y en la Base de datos. Sin embargo, mi código no parece funcionar en el Samsung Galaxy S3 a continuación es el código:

Intento de llamada de la cámara:

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

En el método de actividad para la cámara:

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);     
    }
}

Función de mi imagen (miniatura de mapa de bits):

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);
}

Sin embargo, esto no funcionaba con Samsung S3, cambié el código al siguiente y ahora funciona con Samsung S3, sin embargo, no funciona con ningún otro dispositivo.

Intención de la cámara:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Actividad por resultado:

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();
    }
}

Esta es mi función de imagen ():

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();
    }
}

Mientras que como los tres 1) uriLargeImage 2) largeImagePath 3) uriThumbnailImage, devuélvame la ruta o URI No puedo establecer el mapa de bits creado en mi ImageView. Sin embargo, este es el caso de Samsung S3 solamente, si ejecuto el código editado anteriormente con cualquier otro dispositivo, el programa se bloquea.

En el manifiesto he utilizado.

android:configChanges="keyboardHidden|orientation"

Basado en el tutorial: http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

Sin embargo, si tomo la foto en modo horizontal, ¡todo funciona bien! ¡¡Estoy confundido!! (En Samsung S3)


Finalmente, después de luchar durante tres días, he ideado un mecanismo simple para superar el Samsung S3 Saga.

A continuación se muestra el código, un breve resumen del código es que primero verifico el fabricante del dispositivo y, en base a esto, llamo diferentes intenciones para la cámara.

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 );
        }

    }
}