Качете изображение на сървър от галерия или камера android

имам активност за качване на изображение от галерия или камера към сървър. Качването на изображение от камера е наред, но качването от галерия не е направено. Имам грешка при показване

BitmapFactory﹕ Unable to decode stream: FileNotFoundException

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

моят код:

 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 е моят 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);


}

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)


Ето частта от кода за правене на снимка чрез камера по подразбиране (тук внедрих намерение за извличане на изображението). След това го запазете на 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 можете да използвате този код, за да извлечете пътя на изображението от галерията и да го качите на сървъра, за което можете да използвате намерението като по-долу Intent intent = new Intent(); intent.setType(image/*); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,Select Picture from Gallery), 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