2011-10-21 4 views
0

카메라 장치의 표준 프로그램을 제공하는 활동을 만들었습니다. 그림을 만든 후에는 전화 메모리에 저장되고 그림의 이름이 데이터베이스에 저장됩니다. 문제는 몇 장의 사진을 만들면 데이터베이스의 사진과 레코드 이름이 일치하지 않는다는 것입니다. 예를 들어 : 그 스택 :이 경우Android. onActivityResult의 오류

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

    } 

어떻게 이 문제를 해결하려면?

답변

0

게시 한 활동으로 돌아 가면 날짜 필드가 새로운 난수로 설정되어 있다고 생각합니다. 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(); 
    } 
} 
+0

감사합니다,하지만 당신은 미디어에 저장된 마지막 파일의 이름을 얻기 위해 미디어 제공자를 쿼리로 샘플링 할 수 있습니까? – Kyborg2011

+0

당신이 물어 본 것에 대한 대답에 코드를 추가했습니다. –