简体   繁体   中英

Upload image to server from gallary or camera android

i have a Activity for Upload image from gallary or camera to server.image upload from camera is fine but upload from gallary is not done.i have a error showing

BitmapFactory﹕ Unable to decode stream: FileNotFoundException

i want to do when i pick up the image from gallary it is shown in other Activity on image view. i don't know how to get fileuri for gallary please help me.

my code:

 loadimage = (ImageView) findViewById(R.id.profilpic);
    loadimage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {


         /*   Intent i = new Intent(Tab1.this, ImageMain.class);
            startActivity(i);*/
            //    selectImageFromGallery();

           AlertDialog.Builder builder = new AlertDialog.Builder(Tab1.this);
            builder.setMessage("Select Image From")
                    .setCancelable(true)
                    .setPositiveButton("camera", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                            fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

                            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

                            // start the image capture Intent
                            startActivityForResult(intent, CAMERA_REQUEST);
                        }
                    })
                    .setNegativeButton("gallary", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {

                            Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                            startActivityForResult(intent, RESULT_LOAD_IMAGE);


                        }

                    });
            AlertDialog alert = builder.create();
            alert.show();



        }
    });

Hear is my onActiivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // if the result is capturing Image
    if (requestCode == CAMERA_REQUEST) {
        if (resultCode == RESULT_OK) {

            launchUploadActivity(true);

        } else if (resultCode == RESULT_CANCELED) {

            // user cancelled Image capture
            Toast.makeText(getApplicationContext(),
                    "User cancelled image capture", Toast.LENGTH_SHORT)
                    .show();

        } else {
            // failed to capture image
            Toast.makeText(getApplicationContext(),
                    "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                    .show();
        }

    }
    else if(requestCode==RESULT_LOAD_IMAGE){

        if (resultCode==RESULT_OK){


          launchUploadActivity(true);
        }
    }
}



private void launchUploadActivity(boolean isImage){

    Intent i = new Intent(Tab1.this,UploadAvtivity.class);
    i.putExtra("filePath", fileUri.getPath());
    i.putExtra("isImage", isImage);
    startActivity(i);


}

Here is the Code piece for Taking a Picture through Default Camera (here I implemented Intent to to fetch the image). After that store it to SD card(here a new file will be created and the newly taken image will be stored ); and if you don't want to store then remove the saving part from code. After that you can use the file path for your upload purpose. You can then refer it and change to get the path as your wish.

In the class area put these lines

final int TAKE_PHOTO_REQ = 100;
String file_path = Environment.getExternalStorageDirectory()
            + "/recent.jpg";//Here recent.jpg is your image name which will going to take

After that invoke the camera by putting these line in calling method.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PHOTO_REQ);

then add this method in your Activity to get the picture and save it to sd card and you can invoke your upload method from here to upload the image by knowing its path.

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PHOTO_REQ: {
            if (resultCode == TakePicture.RESULT_OK && data != null) {

                Bitmap srcBmp = (Bitmap) data.getExtras().get("data");

                // ... (process image  if necesary)

                imageView.setImageBitmap(srcBmp);
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                srcBmp.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

                // you can create a new file name "test.jpg" in sdcard folder.
                File f = new File(file_path);
                try {
                    f.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // write the bytes in file
                FileOutputStream fo = null;
                try {
                    fo = new FileOutputStream(f);
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    fo.write(bytes.toByteArray());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // remember close de FileOutput
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Log.e("take-img", "Image Saved to sd card...");
                // Toast.makeText(getApplicationContext(),
                // "Image Saved to sd card...", Toast.LENGTH_SHORT).show();
                break;
            }
        }
        }
    }

Hope this will be helpful for you and others too .. thanks

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM