#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. Спасибо за ответ, но вы можете попробовать запросить поставщика мультимедиа, чтобы получить имя последнего файла, в котором был сохранен носитель?