2012-01-03 3 views
1

Пока у меня есть приложение, которое создаёт новую папку на SD-карте и сохраняет пиктограммы в новой папке.Android Display Camera Изображение в новой активности

Я пытаюсь получить это, как только изображение будет принято, оно будет отображаться в новом действии с двумя кнопками, которые говорят «Использовать» или «Повторить». Пока сохранение изображений работает отлично, но после того, как изображение было снято, и он пытается открыть новую активность, он просто остается на камере Activity и показывает изображение, которое я не могу использовать, поскольку у него есть surfaceView onit.

В моем LogCat я получаю сообщение об ошибке «О, без ссылки», который установлен, чтобы показать, не может ли он найти изображение, поэтому я думаю, что это может быть потому, что я не вызываю изображение из правильного места в моем Punch.java.

Так что я стараюсь, чтобы однажды приложение захватило приложение, чтобы открыть новую активность «Punch.java» и отобразить только что снятое изображение.

UPDATE Благодаря Lumis (код ниже обновлено)

Изменено

intent.putExtra("filepath",uriSavedImage);

в

intent.putExtra("filepath",uriSavedImage.toString());

который теперь открывает новую активность, но по-прежнему не может см. изображение.

UPDATE 2 Punch.java

Я обновил свой Punch.java, как с новым кодом, если я изменить (myRef) к "/sdcard/Punch/image_0.jpg" я могу видеть, что изображение, но мне нужно, чтобы Referance к изображению, которое было просто снятая камера, которая что-то делать с этой линией я думаю intent.putExtra("filepath",uriSavedImage.toString());

Update 3

Почти прекрасно работает в настоящее время использует intent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString());, но по какой-то причине он еще положить mnt/sdcard в начале он просто должен быть sdcard/

Хорошо, теперь работает нормально/шоссе/SDCard это когда SDCard был установлен на компьютер, в то время как я взял картину.

В моей камере деятельности я имею

PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     /*Bitmap bitmapPicture 
      = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); */ 
     int imageNum = 0; 
     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch"); 
     imagesFolder.mkdirs(); // <---- 
     String fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
     File output = new File(imagesFolder, fileName); 
     while (output.exists()){ 
      imageNum++; 
      fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
      output = new File(imagesFolder, fileName); 
     } 

     Uri uriSavedImage = Uri.fromFile(output); 
     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 


     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriSavedImage); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      Toast.makeText(AndroidCamera.this, 
        "Image saved", 
        Toast.LENGTH_LONG).show(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Intent intent = new Intent(getBaseContext(), Punch.class); 
     intent.putExtra("filepath",uriSavedImage.toString()); 
     //just using a request code of zero 
     int request=0; 
     startActivityForResult(intent,request); 
    }}; 

И мой Punch.java что следующая Деятельность:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.punch); 

    String myRef = this.getIntent().getStringExtra("filepath"); 

    File imgFile = new File(myRef); 
    if(imgFile.exists()){ 

     Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

     ImageView myImage = (ImageView) findViewById(R.id.imagepunch); 
     myImage.setImageBitmap(myBitmap); 

    } 

} 

}

+0

Я думаю, что mnt является нормальным, ответьте на этот вопрос: http://stackoverflow.com/questions/7102104/android-how-to-access-a-file -in-the-sd-card Это должно быть tever Environment.getExternalStorageDirectory() возвращает ... – Lumis

ответ

1

Я думаю, что это путь к файлу. Вы отправили свой путь к файлу в качестве URI, но вы читаете его в активности зрителя как строку.

Возможно, вы NEET изменить эту строку в:

intent.putExtra("filepath",uriSavedImage.toString()); 

Или

intent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString()); 

Различные версии андроида не может работать так же, когда речь идет о пути к файлу, так что вам нужно экспериментировать, используя Uri.parse (fileStr) или String ...

+0

Я обновил строку код к вашему ответу выше, который теперь принимает меня к новой активности, но все еще не может видеть изображение? – Matt

+0

Проверьте, находится ли изображение на SD-карте в правой папке. Если это то, что-то не так с файловым путем, который вы используете в decodeFile. Попробуйте вручную ввести путь, который работает в decodeFile, чтобы увидеть его формат. – Lumis

+0

Не знаете, как вы это понимаете, в Punch.java, а не (myRef)? – Matt

0

Просто глядя на ваш код и ваш подход, Я думаю, что вы, как правило, видите в этом сценарии, это новый обработчик контента, зарегистрированный таким образом, чтобы он отображался в разделе «Поделиться» в библиотеке камеры/изображения. Таким образом, вы не участвуете в логике использования/перехвата, которая по существу избыточна для встроенных функций Android. Подумайте о приложении вроде Evernote или Picasa. Вы делаете снимок (или просматриваете его ранее) и выбираете «Поделиться». Одним из вариантов Share, а также Picasa, электронной почты и т. Д. Будет ваше приложение. Вот как я это сделаю.

+0

Я действительно думал об этом, но для работы приложения он должен был сделать снимок определенным образом, поэтому он должен использовать пользовательскую камеру с поверхностьюView – Matt