2010-12-03 7 views
1

У меня есть код, который я экспериментировал, чтобы посмотреть, что я могу сделать с устройством камеры. Этот следующий код работает, но у меня есть некоторые проблемы с ним, которые я не могу решить.Проблема с камерой Android

  1. Первый звонок никогда не работает. При первом запуске кода обратный вызов onPictureTaken никогда не вызывается, поэтому файл никогда не записывается. Тем не менее камера проходит все остальные шаги, в том числе создает поддельные шумы затвора.

  2. Я не могу установить размер изображения на что-то другое, чем оно по умолчанию. Если я попытаюсь установить его на что-то еще, код перестанет работать. Делает то же, что и выше, когда камера проходит все движения, но обратный вызов onPictureTaken никогда не вызывается.

  3. Когда фотографии сохраняются в папке DCIM, снятые снимки не отображаются в приложении «Фотографии» по умолчанию на моем телефоне, если только я не перезагружаю телефон.

  4. Есть ли какой-либо способ посредством кода, чтобы отключить шум затвора?

Извините, код немного грязный, потому что его эксперимент.

Кроме того, этот код выполняется в BroadcastReceiver

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if(intent.getAction().equals(TAKE_PICTURE_INTENT)) 
    { 


     Toast.makeText(context, "Test", Toast.LENGTH_LONG).show(); 


       System.out.println("GOT THE INTENT"); 

        try 
        { 
         Camera camera = Camera.open(); 

         System.out.println("CAMERA OPENED"); 

         Parameters params = camera.getParameters(); 
         params.set("flash-mode", "off"); 
         params.set("focus-mode", "infinity"); 
         params.set("jpeg-quality", "100"); 
         //params.setPictureSize(2592, 1952); 

         String str = params.get("picture-size" + "-values"); 
         System.out.println(str); 

         String size = str.split(",")[0]; 
         System.out.println(size); 

         //params.set("picture-size", size); 

         camera.setParameters(params); 


         System.out.println("CAMERA PARAMETERS SET"); 



         camera.startPreview(); 
         System.out.println("CAMERA PREVIEW STARTED"); 


         camera.autoFocus(new AutoFocusCallBackImpl()); 


        } 
        catch(Exception ex) 
        { 
         System.out.println("CAMERA FAIL, SKIP"); 
         return ; 
        } 


    }//if 

}//onreceive 


private void TakePicture(Camera camera) 
{ 
    camera.takePicture(new Camera.ShutterCallback() { 

     @Override 
     public void onShutter() { 
      // TODO Auto-generated method stub 

      System.out.println("CAMERA SHUTTER CALLBACK"); 
     } 
    } 
    , null, 
     new Camera.PictureCallback() { 

       public void onPictureTaken(byte[] imageData, Camera c) { 
        //c.release(); 

        System.out.println("CAMERA CALLBACK"); 

        FileOutputStream outStream = null; 
        try { 

         System.out.println("Start Callback"); 
         File esd = Environment.getExternalStorageDirectory(); 

         outStream = new FileOutputStream(esd.getAbsolutePath() + String.format(
           "/DCIM/%d.jpg", System.currentTimeMillis())); 

         outStream.write(imageData); 
         outStream.close(); 
         System.out.println("onPictureTaken - wrote bytes: " + imageData.length); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 

          System.out.println("File not found exception"); 
        } catch (IOException e) { 
         e.printStackTrace(); 

          System.out.println("IO exception"); 
        } finally { 
          System.out.println("Finally"); 
          c.release(); 
        } 

       } 
      } 
     ); 
    //camera.release(); 
}//TAKE PICTURE 

private class AutoFocusCallBackImpl implements Camera.AutoFocusCallback { 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
     //bIsAutoFocused = success; //update the flag used in onKeyDown() 
     System.out.println("Inside autofocus callback. autofocused="+success); 
     //play the autofocus sound 
     //MediaPlayer.create(CameraActivity.this, R.raw.auto_focus).start(); 

     if(success) 
     { 
      System.out.println("AUTO FOCUS SUCCEDED"); 
     } 
     else 
     { 
      System.out.println("AUTO FOCUS FAILED"); 
     } 

     TakePicture(camera); 
     System.out.println("CALLED TAKE PICTURE"); 

    } 
}//AUTOFOCUSCALLBACK 

ответ

1

1.First всего поместить всю логику камеры из радиовещательного приемника & положить его в seprate деятельности.

2.

Когда снимки сохраняются в папке DCIM, взятые картинки не отображаются в приложении по умолчанию «Фото» на мой телефон, если я не перезагружать телефон.

потому что MediaScanner необходимо вызвать для повторного сканирования изображений/изменений после съемки. Когда u перезагружает телефон, медиасканер сканирует носитель & находит новые изображения. для этого вы должны проверить MediaScanner.

3.Follow Android камера Tutorial & Camera API

-Спасибо

+0

Я понимаю, что вы имеете в виду о сканере СМИ, я не знал, что это было. Причина в широковещательном приемнике заключается в том, что я надеялся создать что-то, где я мог бы получить изображение через код всякий раз, когда мне было нужно. Я действительно не хочу, чтобы там была какая-то деятельность. – Kratz 2010-12-03 06:08:40