0

I wrote a code which takes picture from android device and then upload it on server.Can also upload pic from gallery. Uploading from gallery works perfectly.It is able to intent to mobile camera when clicked on capture button but when i return i didn't got any image and when i checked the gallery no image was captured.

Got menifest permission also

android.permission.WRITE_EXTERNAL_STORAGE"
android.permission.READ_EXTERNAL_STORAGE"
android.permission.CAMERA"

This is code in my Fragments onCreateView() class:

mTakePhoto = (Button)  rootView.findViewById(R.id.take_photo);
        mselectPhoto = (Button)  rootView.findViewById(R.id.select_photo);
        mImageView = (ImageView)  rootView.findViewById(R.id.imageview);

        mTakePhoto.setOnClickListener(new OnClickListener() {

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

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

    mselectPhoto.setOnClickListener(new OnClickListener() {

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

            Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i,
                    IMAGE_PICKER_SELECT);
        }
    });

In the above code i think intents works perfectly

In bellow code, the (requestCode == IMAGE_PICKER_SELECT) condition works perfectly. But it seems like i didn't get any data when i took PICTURE

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_PICKER_SELECT
            && resultCode == Activity.RESULT_OK) {
        Bitmap bitmap = getBitmapFromCameraData(data, getActivity());
        int nh = (int) (bitmap.getHeight() * (512.0 / bitmap.getWidth()));
        Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 512, nh, true);
        mImageView.setImageBitmap(scaled);
        new UploadTask().execute(bitmap);
    }
    if (requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK
            && data != null) {
        // get bundle
        Bundle extras = data.getExtras();
        // get bitmap
        cameraBitmap = (Bitmap) extras.get("data");
        int nh = (int) (cameraBitmap.getHeight() * (512.0 / cameraBitmap
                .getWidth()));
        Bitmap scaled = Bitmap.createScaledBitmap(cameraBitmap, 512, nh,
                true);
        mImageView.setImageBitmap(scaled);
        new UploadTask().execute(cameraBitmap);
        // setPic();

    }
}

I m also giving the Code of my Multipartentity class

public class MultipartEntity implements HttpEntity {
enter code here
private String boundary = null;

ByteArrayOutputStream out = new ByteArrayOutputStream();
boolean isSetLast = false;
boolean isSetFirst = false;

public MultipartEntity() {
    this.boundary = System.currentTimeMillis() + "";
}

public void writeFirstBoundaryIfNeeds(){
    if(!isSetFirst){
        try {
            out.write(("--" + boundary + "\r\n").getBytes());
        } catch (final IOException e) {

        }
    }
    isSetFirst = true;
}

public void writeLastBoundaryIfNeeds() {
    if(isSetLast){
        return ;
    }
    try {
        out.write(("\r\n--" + boundary + "--\r\n").getBytes());
    } catch (final IOException e) {

    }
    isSetLast = true;
}

public void addPart(final String key, final String value) {
    writeFirstBoundaryIfNeeds();
    try {
        out.write(("Content-Disposition: form-data; name=\"" +key+"\"\r\n").getBytes());
        out.write("Content-Type: text/plain; charset=UTF-8\r\n".getBytes());
        out.write("Content-Transfer-Encoding: 8bit\r\n\r\n".getBytes());
        out.write(value.getBytes());
        out.write(("\r\n--" + boundary + "\r\n").getBytes());
    } catch (final IOException e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());

    }
}

public void addPart(final String key, final String fileName, final InputStream fin){
    addPart(key, fileName, fin, "application/octet-stream");
}

public void addPart(final String key, final String fileName, final InputStream fin, String type){
    writeFirstBoundaryIfNeeds();
    try {
        type = "Content-Type: "+type+"\r\n";
        out.write(("Content-Disposition: form-data; name=\""+ key+"\"; filename=\"" + fileName + "\"\r\n").getBytes());
        out.write(type.getBytes());
        out.write("Content-Transfer-Encoding: binary\r\n\r\n".getBytes());

        final byte[] tmp = new byte[4096];
        int l = 0;
        while ((l = fin.read(tmp)) != -1) {
            out.write(tmp, 0, l);
        }
        out.flush();
    } catch (final IOException e) {

    } finally {
        try {
            fin.close();
        } catch (final IOException e) {

        }
    }
}

public void addPart(final String key, final File value) {
    try {
        addPart(key, value.getName(), new FileInputStream(value));
    } catch (final FileNotFoundException e) {

    }
}

@Override
public long getContentLength() {
    writeLastBoundaryIfNeeds();
    return out.toByteArray().length;
}

@Override
public Header getContentType() {
    return new BasicHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
}

@Override
public boolean isChunked() {
    return false;
}

@Override
public boolean isRepeatable() {
    return false;
}

@Override
public boolean isStreaming() {
    return false;
}

@Override
public void writeTo(final OutputStream outstream) throws IOException {
    outstream.write(out.toByteArray());
}

@Override
public Header getContentEncoding() {
    return null;
}

@Override
public void consumeContent() throws IOException,
UnsupportedOperationException {
    if (isStreaming()) {
        throw new UnsupportedOperationException(
        "Streaming entity does not implement #consumeContent()");
    }
}

@Override
public InputStream getContent() throws IOException,
UnsupportedOperationException {
    return new ByteArrayInputStream(out.toByteArray());
}

}

I m stuck for almost the fullday. Help!!

Jesmeen Hoque
  • 411
  • 4
  • 8

2 Answers2

0

Open your camera with below code and check with it:

private Uri mImageCaptureUri;
mImageCaptureUri = Uri.parse("content://YOUR PACKAGE NAME/");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,mImageCaptureUri);
intent.putExtra("return-data", true);
startActivityForResult(intent,TAKE_PICTURE);
Pratik Dasa
  • 7,439
  • 4
  • 30
  • 44
0

I created a method to call whn button is clicked

        mTakePhoto.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
        takePhoto();
        }
    });

method to intent and getTempFile() to keel temporary file..

    private void takePhoto(){
      final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(getActivity())) ); 
      startActivityForResult(intent, TAKE_PICTURE);
    }

    private File getTempFile(Context context){
      final File path = new File( Environment.getExternalStorageDirectory(), context.getPackageName() );
      if(!path.exists()){
        path.mkdir();
      }
      return new File(path, "image.tmp");
    }

this link helped me.

Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
Jesmeen Hoque
  • 411
  • 4
  • 8