Android. Ошибка в onActivityResult

#android #android-activity #camera

#Android #android-активность #камера

Вопрос:

Я создал activity, который предлагает стандартную программу для устройства камеры. После создания изображений они сохраняются в памяти телефона, а названия изображений заносятся в базу данных. Проблема в том, что если вы создаете несколько фотографий, то название фотографии и запись в базе данных не совпадают. Например: этот стек:

 10-21 20:22:37.617: I / System.out (22 016): Debug - name of foto - 70,134,596
10-21 20:22:45.195: I / System.out (22 016): Debug - name of foto - 89,410,152
10-21 20:22:45.382: I / System.out (22 016): Debug - name of database record - 89,410,152
 

В этом случае создается фотография с именем — 70134596, но в базу данных попадает номер записи — 89410152. Вот код:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        File photo = null;

        date = (int) (Math.random() * 100000000);

        photo = new File(Environment.getExternalStorageDirectory()
                  "/DebtorMini", date   ".jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));

        imageUri = Uri.fromFile(photo);
        System.out.println("Debug - name of foto - "   date);

        startActivityForResult(intent, TAKE_PICTURE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PICTURE:
            if (resultCode == Activity.RESULT_OK) {
                Uri selectedImage = imageUri;
                getContentResolver().notifyChange(selectedImage, null);
                ImageView imageView = new ImageView(ctx);
                setContentView(imageView);
                ContentResolver cr = getContentResolver();
                Bitmap bitmap = null;

                try {
                    bitmap = android.provider.MediaStore.Images.Media
                            .getBitmap(cr, selectedImage);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                imageView.setImageBitmap(bitmap);
                Toast.makeText(this, selectedImage.toString(),
                        Toast.LENGTH_LONG).show();

                DataBaseHelper helper = new DataBaseHelper(this);
                try {
                    helper.createDataBase();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                Bundle extras = getIntent().getExtras();
                String category = extras.getString("category");
                String address = extras.getString("address");

                Toast.makeText(
                        this,
                        "Фотография успешно создана категория - "   category
                                  "  адресс - "   address, Toast.LENGTH_SHORT)
                        .show();
                helper.openDataBase();
                helper.exec("INSERT INTO 'photos' (`id`, `address`, `category`) VALUES ('"
                          date   "', '"   address   "', '"   category   "')");
                System.out.println("Debug - name of database record - "   date);

                helper.close();
            }
        }

    }
 

Как решить эту проблему?

Ответ №1:

Я бы предположил, что в вашем поле даты будет установлено новое случайное число, когда вы вернетесь к опубликованному вами действию. Поместите точку останова в вашу функцию onCreate, и я подозреваю, что она вызывается более одного раза. Скорее всего, это связано с поворотом вашего телефона.

При этом вам действительно следует просто запрашивать поставщика мультимедиа, чтобы получить имя файла, в котором был сохранен носитель. Кроме того, вы должны сохранить поле даты с помощью onSaveInstanceState и onRestoreInstanceState .

Редактировать

 Cursor c = getContentResolver().query(mediaUri, new String[] { MediaStore.Images.ImageColumns.DATA }, null,null,null);
if(c != null) { 
    try {
        if(c.moveToFirst()) {
            String fullFilePath = c.getString(0); 
            String fileName = new File(fullFilePath).getName();
        }
    } finally { 
         c.close();
    }
 }
 

Комментарии:

1. Спасибо за ответ, но вы можете попробовать запросить поставщика мультимедиа, чтобы получить имя последнего файла, в котором был сохранен носитель?