Делая снимок с намерением камеры, никогда не возвращайтесь к onActivityResult()

У меня есть действие, которое вызывается из TabActivity (я знаю, что оно устарело) как:

intent2 = new Intent().setClass(this, sin2.class);
spec = tabHost.newTabSpec("second").setIndicator("Second").setContent(intent2);
tabHost.addTab(spec);   

это действие, которое делает снимки, сохраняет их и устанавливает миниатюру. Он отлично работает на многих устройствах, но на Samsung Galaxy Pocket или Galaxy Wonder (всегда Android 2.x) иногда при запуске камеры Намерение никогда не вернется к onActivityResult(), что означает:

  1. я делаю снимок
  2. я сохраняю это
  3. Я не вернусь к onActivityResult()
  4. Это позволяет мне сделать еще один снимок

и зацикливание... Я никогда не вернусь, если я нажму finish(), я вернусь к своей текущей деятельности.

Я читал в StackOverflow о таких вещах, как getParent().startActivityForResult(Intent,RequestCode);, но это не работает.

Вот как я фотографирую:

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mMakePhotoUri = Uri.fromFile(photofile);
i.putExtra(MediaStore.EXTRA_OUTPUT, mMakePhotoUri);
startActivityForResult(i, num);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode==RESULT_OK)
    {
        if (requestCode == 1)
        {
            .............. things I do.
        }
    }
}

Заранее спасибо!!


МОЙ КОД:

на onCreate (photo — растровое изображение):

        scatta.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            photo = null; 
            if(foto1.getDrawable()==null)
                foto(1);
            else if(foto2.getDrawable()==null)
                foto(2);
            else if(foto3.getDrawable()==null)
                foto(3);
            else
                Toast.makeText(sinistri2.this, "Cancella una foto per poter scattare un'altra", Toast.LENGTH_LONG).show();
        }
    });

фото(int) функция:

@SuppressLint("SimpleDateFormat")
public void hacerfoto(int num){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String n = sdf.format(new Date());
String fotoname = "Immagine-"+ n +".jpg";
File photostorage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File photostorage2 = new File(photostorage, "im");
photostorage2.mkdirs();
photofile = new File(photostorage2, fotoname);

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mMakePhotoUri = Uri.fromFile(photofile);
i.putExtra(MediaStore.EXTRA_OUTPUT, mMakePhotoUri);
startActivityForResult(i, num);
}

моя функция onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    String filename = sacarfoto();

    if (requestCode == 1){

        sacarfoto();


        if(photo != null){
            ruta1 = sacarfoto();
            foto1.setBackgroundColor(Color.parseColor("#00000000"));
            photo = f.resize(photo, filename);
            foto1.setImageBitmap(photo);

            cancellare1.setVisibility(View.VISIBLE);

        }
        else{
            cancellare1.setVisibility(View.GONE);
            foto1.setBackgroundResource(R.drawable.fondoicona);
            Toast.makeText(this, "C'è stato un errore, riprova a scattare la foto", Toast.LENGTH_LONG).show();
        }

        try {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(ruta1);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
        } catch (Exception e) {

        }
    }
    if (requestCode == 2){
        sacarfoto();
        if(photo != null){
            ruta2 = sacarfoto();
            photo = f.resize(photo, filename);
            foto2.setImageBitmap(photo);
            foto2.setBackgroundColor(Color.parseColor("#00000000"));
            cancellare2.setVisibility(View.VISIBLE);
        }
        else{
            cancellare2.setVisibility(View.GONE);
            foto2.setBackgroundResource(R.drawable.fondoicona);
            Toast.makeText(this, "C'è stato un errore, riprova a scattare la foto", Toast.LENGTH_LONG).show();
        }

        try{
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(ruta2);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
        } catch (Exception e) {

        }
    }
    if (requestCode == 3){
         sacarfoto();

        if(photo != null){
            ruta3 = sacarfoto();
            photo = f.resize(photo, filename);
            foto3.setImageBitmap(photo);
            foto3.setBackgroundColor(Color.parseColor("#00000000"));
            cancellare3.setVisibility(View.VISIBLE);

        }
        else{
            cancellare3.setVisibility(View.GONE);
            foto3.setBackgroundResource(R.drawable.fondoicona);
            Toast.makeText(this, "C'è stato un errore, riprova a scattare la foto", Toast.LENGTH_LONG).show();
        }

        try {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(ruta3);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
        } catch (Exception e) {

        }
    }
    if (requestCode == 4) {

        try{
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            photo = f.decodeAndResizeFile(new File(selectedImagePath));


        } catch(NullPointerException ex){
            try {
            photo = (Bitmap) data.getExtras().get("data");
            }
            catch (Exception e){
                photo = BitmapFactory.decodeFile(selectedImagePath);        
            }
        }
            if(photo != null){
                if (foto1.getDrawable()==null){
                    photo = f.resize(photo,selectedImagePath);
                    ruta1 = selectedImagePath;
                    foto1.setImageBitmap(photo);
                    foto1.setBackgroundColor(Color.parseColor("#00000000"));
                    cancellare1.setVisibility(View.VISIBLE);
                }
                else if (foto2.getDrawable()==null){
                    photo = f.resize(photo,selectedImagePath);
                    ruta2 = selectedImagePath;
                    foto2.setImageBitmap(photo);
                    foto2.setBackgroundColor(Color.parseColor("#00000000"));
                    cancellare2.setVisibility(View.VISIBLE);
                }
                else if (foto3.getDrawable()==null){
                    photo = f.resize(photo,selectedImagePath);
                    ruta3 = selectedImagePath;
                    foto3.setImageBitmap(photo);
                    foto3.setBackgroundColor(Color.parseColor("#00000000"));
                    cancellare3.setVisibility(View.VISIBLE);
                }
                else
                    Toast.makeText(sinistri2.this, "Cancella una foto per poter scattare un'altra", Toast.LENGTH_LONG).show();


            }
            else{

                Toast.makeText(this, "Non si è potuto riuscire, riprova scattando una foto o scegliendo una foto dalla gallery.", Toast.LENGTH_LONG).show();
            }
    }
    }

}

функция sacarfoto() дает строку, но иногда работает для выполнения процесса, но в этой ошибке это не имеет значения.


person Rafael Ruiz Muñoz    schedule 09.01.2014    source источник
comment
Каково значение числа?   -  person Rahul Gupta    schedule 09.01.2014
comment
У меня много if (requestCode == someNum) и я с этим справляюсь... на некоторых устройствах работает нормально, например на моем. число может быть 1, 2 или 3   -  person Rafael Ruiz Muñoz    schedule 09.01.2014


Ответы (1)


Я почти уверен, что вы думаете, что он никогда не возвращался, но на самом деле он возвращает RESULT_CANCEL. Попробуйте добавить if(result == RESULT_CANCEL) в свой onActivityResult. Может камера не смогла сохранить картинку или что-то в этом роде.

person Alessandro Roaro    schedule 09.01.2014
comment
но иногда это работает нормально ... Я имею в виду ... если это время не работает, я перезапускаю приложение и работает нормально ... вы все равно дадите мне этот ответ? знак равно Спасибо за ваше время. - person Rafael Ruiz Muñoz; 09.01.2014
comment
попробуйте сделать отладку и выяснить, что не так. Возвращает ли намерение нулевые дополнения? изображение сохраняется? - person Alessandro Roaro; 09.01.2014
comment
Да изображение сохраняется как я и говорил, значит интент нулевой =) - person Rafael Ruiz Muñoz; 09.01.2014
comment
ммм, это действительно странно. Андроид иногда так расстраивает. Дайте мне знать, если вы найдете обходной путь - person Alessandro Roaro; 09.01.2014
comment
Я должен попробовать RESULT_CANCEL... Я сейчас не на своем компьютере-кодировщике... скоро замечу, еще раз спасибо ;) - person Rafael Ruiz Muñoz; 09.01.2014
comment
tra italiani ci si aiuta ;) - person Alessandro Roaro; 09.01.2014