Загрузить изображение на сервер из галереи или камеры Android

У меня есть активность для загрузки изображения из галереи или камеры на сервер. Загрузка изображения с камеры в порядке, но загрузка из галереи не выполнена. У меня отображается ошибка

BitmapFactory﹕ Unable to decode stream: FileNotFoundException

я хочу сделать, когда я беру изображение из галереи, оно отображается в другом действии при просмотре изображения. я не знаю, как получить fileuri для галереи, пожалуйста, помогите мне.

мой код:

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



        }
    });

Услышьте мой onActivityResult

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


}

person RushDroid    schedule 16.06.2015    source источник
comment
эта часть вашего кода в порядке. Проблема заключается в onActivityResult, где вы декодируете файл. Пожалуйста, покажите мне свой onActivityResult, чтобы я мог вам помочь   -  person AnswerDroid    schedule 16.06.2015
comment
пожалуйста, проверьте мою обновленную цитату @AndroidLearner   -  person RushDroid    schedule 16.06.2015


Ответы (1)


Вот фрагмент кода для получения изображения через камеру по умолчанию (здесь я реализовал Intent to для получения изображения). После этого сохраните его на SD-карту (здесь будет создан новый файл и сохранено новое изображение); и если вы не хотите хранить, удалите часть сохранения из кода. После этого вы можете использовать путь к файлу для целей загрузки. Затем вы можете передать его и изменить, чтобы получить путь по вашему желанию.

В области класса поместите эти строки

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

После этого вызовите камеру, поместив эту строку в вызывающий метод.

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

затем добавьте этот метод в свою активность, чтобы получить изображение и сохранить его на SD-карту, и вы можете вызвать свой метод загрузки отсюда, чтобы загрузить изображение, зная его путь.

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

Надеюсь, это будет полезно для вас и других .. спасибо

person sahu    schedule 16.06.2015
comment
моя загрузка захвата камеры в порядке. моя проблема заключается в загрузке изображения из галереи на сервер - person RushDroid; 16.06.2015
comment
А (Bitmap) data.getExtras().get("data"); — это просто миниатюра сделанного снимка. Так что он ничему не служит. - person greenapps; 16.06.2015
comment
@Rushabh042, вы можете использовать этот код, чтобы получить путь к изображению из галереи и загрузить его на сервер, для чего вы можете использовать намерение, как показано ниже Intentintent=newIntent(); намерение.setType(изображение/*); намерение.setAction (намерение.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,Выбрать изображение из галереи), SELECT_PICTURE); - person sahu; 16.06.2015
comment
stackoverflow.com/questions/10473823 / - person sahu; 16.06.2015
comment
if you don't want to store then remove the saving part from code. After that you can use the file path это звучит странно или это только мне кажется? Вам не нужно сохранять, но вам нужен путь к файлу? - person Hiro; 24.02.2021