33

Mam problem z przechwytywaniem obrazu i zapisaniem go w macierzystej aplikacji aparatu. Oto próbka niektórych z mojego kodu.Jak przechwytywać obraz i przechowywać go w macierzystej kamerze Android

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg"; 
File file = new File(_path); 
Uri outputFileUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, 0); 

Po zdjęcie zostało zrobione, a ja wróciłem do mojej pierwotnej działalności, Kiedy przejdź do mojej karty sd poprzez Android DDMS File Explorer obraz nie ma. Ktoś wie, dlaczego to nie jest zapisane?

+0

Witam wszystkich, chcę, aby przechwycić obraz przez Native kamery Androida i przechowywać go ..so że zrobiłem bounty becoz kłopot z nim –

+0

Paresh jakie są twoje problemy z przechwytywaniem obrazu? Czy podejście przedstawione w tym pytaniu nie działa dla ciebie? – Janusz

+0

@Janusz Muszę umieścić jeden widok tekstowy (nazwa działania), jeden przycisk (na dole) i na środku ekranu, podgląd kamery jest dostępny i zdarzenie click button, zdjęcie powinno zostać kliknięte, a zdjęcie powinno być wyświetlane w widoku innego działalność –

Odpowiedz

20

Czy sprawdziłeś, co jest wynikiem działania Environment.getExternalStorageDirectory(), ponieważ jeśli nie zawiera on końcowego seperatora plików (/), to twój obraz trafi do katalogu, który nie znajduje się na karcie SD, na przykład:

/mnt/sdcardmake_machine_example.jpg 

Po co naprawdę chcesz to:

/mnt/sdcard/make_machine_example.jpg 

Spróbuj zamiast tego kodu:

_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg"; 
+2

tak, mogę potwierdzić, że trzeba będzie dodać separator plików –

14

1. Po prostu użyj

i nie przejmuj się separatorami.

2. Wcześniej ten sam problem. Telefony SenseUI mają niestandardową aplikację kamery, która nie tworzy plików. Z jakiego urządzenia korzystasz? Może być już naprawiony w najnowszych urządzeniach, ale może również stanowić problem. Oto pełna próbka jak go pokonać Problems saving a photo to a file.

25

Tu był produkt końcowy w przypadku gdy ktoś jest nadal odwiedzenie ten wątek:

public class CameraCapture extends Activity { 

    protected boolean _taken = true; 
    File sdImageMainDirectory; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     try { 

      super.onCreate(savedInstanceState);   
        File root = new File(Environment 
          .getExternalStorageDirectory() 
          + File.separator + "myDir" + File.separator); 
        root.mkdirs(); 
        sdImageMainDirectory = new File(root, "myPicName"); 


       startCameraActivity(); 
      } 
     } catch (Exception e) { 
      finish(); 
      Toast.makeText(this, "Error occured. Please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected void startCameraActivity() { 

     Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (resultCode) { 
     case 0: 
      finish(); 
      break; 

     case -1: 

      try { 
       StoreImage(this, Uri.parse(data.toURI()), 
         sdImageMainDirectory); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
      startActivity(new Intent(CameraCapture.this, Home.class)); 

     } 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
      _taken = true; 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
    } 

     public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

Czy musisz ustawić dodatkowe uprawnienia w manifeście? Nie mogę podać własnego nazwiska do pliku obrazu zapisanego na sd – Vincent

+0

tak ... \t ninjasense

+0

Cześć Ninja !! Czy mogę wiedzieć, czym jest "Home.class" ???? jego powiedzenie, aby utworzyć klasę/enum itp. Jestem nowy w programowaniu Android. – iankits

-5

Dodaj tę linię do AndroidManifest.xml pliku i usunąć rozszerzenie make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

on zacznie aby przechwycić zdjęcie i zapisać na kartę SD.

+0

nie będzie przechowywało przechwyconego obrazu. –

1

Należy przeprowadzić skanowanie mediów po zapisaniu obrazu

sendBroadcast(new Intent(
      Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
Powiązane problemy