Taking a high quality image through default camera activity and saving it o the sd card

怎甘沉沦 提交于 2019-12-24 10:19:34

问题


I am taking a high resolution picture through the default camera activity(using intent.put Extras),and saving it to the sd card,

Code:

public class CameraActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */

    Button takepicture ;
    ImageView iv ;
    TextView tv;
    Button show;

    String filepath;
    Intent i;
    Uri mUri;

    final static int cameraData = 0;

    File folder = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        takepicture = (Button) findViewById(R.id.button1);
        iv = (ImageView) findViewById(R.id.imageView1);
        tv = (TextView) findViewById(R.id.textView1);
        show = (Button) findViewById(R.id.button2);
        takepicture.setOnClickListener(this);
        show.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        switch(v.getId()){

        case R.id.button1:

            String sdcardstate = android.os.Environment.getExternalStorageState();

            if(sdcardstate.contentEquals(android.os.Environment.MEDIA_MOUNTED)){

                 filepath = Environment.getExternalStorageDirectory().getPath();

                 folder = new File(filepath,"wax");

                 if(!folder.exists()){
                     try {
                        folder.createNewFile();
                         Log.d("folder created", "ya");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                 }

                 mUri = Uri.fromFile(folder);
                 Log.d("bk", mUri.toString());

                 i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                 i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mUri);

                 Log.d("extra", "extra");
                 startActivityForResult(i,cameraData);
            }
            break;

        case R.id.button2:

            File f = new File(filepath,"bmp.png");

            Bitmap myBitmap = BitmapFactory.decodeFile(f.getAbsolutePath());              

            iv.setImageBitmap(myBitmap);                
            break;
        }           
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode==RESULT_OK){

            tv.setText("Result ok");
            Log.d("ok", "ok");
            Bundle extras = data.getExtras();

            Bitmap bmp = (Bitmap) extras.get("data");
        }
    }
}

The camera activity starts , the image is taken , But when i click save , it does not return and force closes.

I have read quite a few threads on this , Learnt that file must be created before the camera activity is started , but still it does not.

Please help , I'm stuck on this problem for a week or so.

Logcat error

06-15 16:05:50.205: W/dalvikvm(1780): threadid=10: thread exiting with uncaught exception (group=0x4001d800)
06-15 16:05:50.205: E/AndroidRuntime(1780): FATAL EXCEPTION: GLThread 12
06-15 16:05:50.205: E/AndroidRuntime(1780): java.lang.IllegalArgumentException: No configs match configSpec
06-15 16:05:50.205: E/AndroidRuntime(1780):     at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:760)
06-15 16:05:50.205: E/AndroidRuntime(1780):     at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:916)
06-15 16:05:50.205: E/AndroidRuntime(1780):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1246)
06-15 16:05:50.205: E/AndroidRuntime(1780):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
06-15 16:05:50.294: W/ActivityManager(59):   Force finishing activity com.android.camera/.Camera
06-15 16:05:50.444: V/camera(1780): stopPreview

回答1:


Use following to achieve this.

Before you call CameraIntent create a file and uri based on that filepath as shown here.

filename = Environment.getExternalStorageDirectory().getPath() + "/test/testfile.jpg";
imageUri = Uri.fromFile(new File(filename));

// start default camera
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                imageUri);
startActivityForResult (cameraIntent, CAMERA_PIC_REQUEST);

Now, you have the filepath you can use it in onAcityvityResult method as following,

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode != CAMERA_PIC_REQUEST || filename == null)
        return;
    ImageView img = (ImageView) findViewById(R.id.image);
    img.setImageURI(imageUri);
}



回答2:


This smells like outOfMemoryException. Instead of just fetching the huge picture file directly you need to do some code magic so that it doesn't eat up all the memory. Check out some documentation here: http://developer.android.com/training/displaying-bitmaps/index.html

And some code 4 u:

public Bitmap decodeFile(File f, int size){
    try {

        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //Find the correct scale value. It should be the power of 2.
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;

        while(true){
            if(width_tmp/2<size) // || height 
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    return null;
}



回答3:


Try to put all the code in Respective Try Catch Exception handling. Then debug the code and check where the exception is thrown. You might be running out of memory exception.

Follow this:

http://developer.android.com/training/camera/photobasics.html




回答4:


public class MainActivity extends AppCompatActivity {

    private static final int CAMERA_REQUEST = 1888;
    private ImageView imageView;
    private LinearLayout view;
    private TextView photoButton, shareButton, saveButton;
    private Bitmap b, photo;
    private static final int MY_CAMERA_PERMISSION_CODE = 100;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view = findViewById(R.id.view);
        imageView = findViewById(R.id.image);
        photoButton = this.findViewById(R.id.captur);

        photoButton.setOnClickListener(new View.OnClickListener() {

            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View v) {
                if (checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_CAMERA_PERMISSION_CODE);
                } else {
                    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(cameraIntent, CAMERA_REQUEST);

                }
            }
        });

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == MY_CAMERA_PERMISSION_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
                Intent cameraIntent = new
                        Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            } else {
                Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
            }

        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
            photo = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(photo);
            //convert bitmap
            view.setDrawingCacheEnabled(true);

            view.buildDrawingCache(true);
            b = Bitmap.createBitmap(view.getDrawingCache());
            view.setDrawingCacheEnabled(false);

        }
    }
}


来源:https://stackoverflow.com/questions/11048505/taking-a-high-quality-image-through-default-camera-activity-and-saving-it-o-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!