2011-08-03 9 views
0

私はAndroid開発の初心者です。私は以前の同僚によって開始されたプロジェクトを続行する必要があります。 このアプリケーションでは、個人情報を含む顧客ファイルがあり、写真を撮るためのボタンがあります。 しかしここに問題があります:これは、HTC Desireやその他のAndroid搭載端末では正常に動作しますが、Galaxy SやGalaxy S IIでは正常に動作しません。アンドロイドアプリから写真を撮る(ギャラクシーS/SIIで動作しない)

使用されるアルゴリズムは基本的です。スクリーンまたはセンターパッドをタッチすると、「カメラ」クラスのautoFocusメソッドが使用されます。次に、直前の画像を表示し、メニューボタンまたは「戻る」ボタンを押すと、画像を保存するかどうかを尋ねるダイアログが表示されます。ここで

は "CameraView.java" のコードです:

public class CameraView extends Activity implements Callback, AutoFocusCallback 
{ 
    private Camera camera; 
    private FrameLayout layout; 
    private SurfaceView surface; 

    private String idPatient; 
    private boolean start; 
    private int click; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setBackgroundDrawable(null); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     layout = new FrameLayout(this); 
     surface = new SurfaceView(this); 
     surface.getHolder().addCallback(this); 
     surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     layout.addView(surface); 
     setContentView(layout); 

     idPatient = (String) this.getIntent().getStringExtra("lePatient"); 
     start = false; 
     click = 0; 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event){ 
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) 
     { 
      click++; 
      if((!start)&&(click==1)) 
      { 
       camera.autoFocus(this); 
       return true; 
      } 
     } 
     if (keyCode == KeyEvent.KEYCODE_BACK) 
     { 
      finish(); 
     } 
     return false; 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      click++; 
      if((!start)&&(click==1)) 
      { 
       camera.autoFocus(this); 
       return true; 
      }  
     } 
     return false; 
    } 

    public void onAutoFocus(boolean success, Camera camera) 
    { 
     start = true; 
     PictureCallback picture = new PictureCallback() 
     { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) 
      { 
       Intent intentPhoto = new Intent(CameraView.this, PhotoView.class); 
       intentPhoto.putExtra("lePatient", idPatient); 
       intentPhoto.putExtra("laPhoto", data); 
       CameraView.this.startActivityForResult(intentPhoto, 101); 

       camera.startPreview(); 
       start = false; 
       click = 0; 
      } 
     }; 
     camera.takePicture(null, null, picture); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     Camera.Parameters params = camera.getParameters(); 
     params.setPictureFormat(PixelFormat.JPEG); 
     params.setPreviewSize(width, height); 
     camera.setParameters(params); 
     camera.startPreview(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     try 
     { 
      camera = Camera.open(); 
      camera.setPreviewDisplay(holder); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    /** 
    * Fermeture de l'activity 
    */ 
    protected void onDestroy() 
    { 
     super.onDestroy(); 
    } 

} 

そして "photoView.java" クラス:

public class PhotoView extends Activity 
{ 
    private static final int DIALOG_ENREGISTRER = 10; 

    private ImageView photo; 
    private byte[] data; 
    private String idPatient; 
    private DBAdapter db; 

    /** 
    * Creation de l'activity 
    */ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setBackgroundDrawable(null); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.photoview); 

     db = new DBAdapter(this); 
     db.open(); 

     idPatient = (String) this.getIntent().getStringExtra("lePatient"); 
     data = (byte[]) this.getIntent().getByteArrayExtra("laPhoto"); 
     photo = (ImageView) this.findViewById(R.id.photo); 

     Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);  

     int w = bmp.getWidth(); 
     int h = bmp.getHeight(); 
     Matrix mtx = new Matrix(); 
     mtx.postRotate(90); 
     Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 

     WindowManager manager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
     Display display = manager.getDefaultDisplay(); 
     int height= display.getHeight(); 
     int width= display.getWidth(); 
     Bitmap bmpFullScreen = Bitmap.createScaledBitmap(rotatedBMP, width, height, true); 

     photo.setImageBitmap(bmpFullScreen); 
    } 

    /** 
    * Permet de récuperer un évènement de click de touche 
    */ 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if((keyCode==KeyEvent.KEYCODE_BACK) ||(keyCode==KeyEvent.KEYCODE_MENU))// zoom in 
     { 
      showDialog(DIALOG_ENREGISTRER); 
     } 
     //return super.onKeyUp(keyCode, event); 
     return false; 
    } 

    /** 
    * Permet de créer des boites de dialog 
    */ 
    protected Dialog onCreateDialog(int id) 
    { 
     switch (id) 
     { 
      case DIALOG_ENREGISTRER: 
       return new AlertDialog.Builder(PhotoView.this) 
        .setIcon(android.R.drawable.ic_menu_info_details) 
        .setTitle("Enregistrer ?") 
        .setPositiveButton("OUI", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) 
         { 
          String title = PhotoView.this.savePhotoDB(); 
          PhotoView.this.savePhotoFS(title); 

          finish(); 
         } 
        }) 
        .setNegativeButton("NON", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) 
         { 
          finish(); 
         } 
        }) 
        .create(); 
     } 
     return null; 
    } 

    /** 
    * Permet de sauvegarder une photo dans la base de données 
    * @param title 
    */ 
    private String savePhotoDB() 
    { 
     Log.i("","idPatient : " +idPatient); 
     String comment = "Note : "; 
     Log.i("","comment : " + comment); 

     Date maintenant = new Date(System.currentTimeMillis()); 

     SimpleDateFormat formatDateJour = new SimpleDateFormat("yyyyddMM"); 
     String date = formatDateJour.format(maintenant); 
     Log.i("","Date formatée : " + date); 
     SimpleDateFormat formatHeure = new SimpleDateFormat("mmss"); 
     String heure = formatHeure.format(maintenant); 
     Log.i("","Heure formatée : " + heure); 

     String fileName = "photo"+date+heure+".jpeg"; 
     Log.i("","fileName : " + fileName); 

     String title = "photo"+date+heure+".jpeg"; 
     Log.i("","title : " + title); 
     String userDefined = "1"; 
     Log.i("","userDefined : " + userDefined); 

     db.insererPhoto(idPatient, comment, date, fileName, title, userDefined); 
     return title; 
    } 

    /** 
    * Permet de sauvegarder une photo sur le file system 
    * @param title 
    */ 
    private void savePhotoFS(String title) { 
     try 
     { 
      File fs = new File(PhotoView.this.getFilesDir()+"/"+title); 
      FileOutputStream fos = new FileOutputStream(fs); 
      fos.write(data); 
      fos.flush(); 
      fos.close(); 
      //Toast.makeText(PhotoView.this, ""+fs.getAbsolutePath(), Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Fermeture de l'activity 
    */ 
    protected void onDestroy() 
    { 
     db.close(); 
     super.onDestroy(); 
    } 

} 

誰も私を助けてくださいことはできますか?読書のための

感謝:)以下

+0

が例外を投稿助けることができます。何が起こっている?それはクラッシュですか?または写真を撮った後でデータが返されないのですか? – Jack

+0

ああ、すみません、私はその部分を忘れました^^。さて、私が画面に触れているとき、私は写真が撮られていると思う(私は音が聞こえ、オートフォーカスがある)が、その後私に写真を撮ったのではなく、カメラに戻る私の写真を保存することはできません。私は私の電話アルバムをチェックしましたが、この写真もここにはありません。私は問題が "onAutoFocus"メソッドから来て、 "PhotoView"クラス(他のデバイスではうまく動作しますが、私が言ったようにGalaxy Sではうまく動作しません)を呼び出す必要があると思います。 =>申し訳ありませんが私の英語が悪い場合は、私の母国語ではありません^^ – Vince

+0

アップ?誰も私を助けることができますか? :(:( – Vince

答えて

1

私はあなたがやろうとしているのと同じことを行うために使用されるコードです。 SurfaceViewを作成し、カメラのプレビューを開始します。画面の任意の場所をタップすると、画像が撮影され、表示され、保存と再試行の2つのボタンが表示されます(onPictureTakenメソッドを参照)。ユーザーは[保存]をクリックしてデータをアプリケーションに戻すか、再試行できます(リトライ機能を終了していないと判断し、finish()を呼び出します)。お役に立てれば。

public class SnapShot extends Activity implements OnClickListener, 
     SurfaceHolder.Callback, Camera.PictureCallback { 

    SurfaceView cameraView; 
    SurfaceHolder surfaceHolder; 
    Camera camera; 
    LayoutInflater inflater; 
    Uri imageFileUri; 
    Button save; 
    Button retry; 
    View viewControl; 
    LayoutParams layoutParamsControl; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.view_camera); 

     cameraView = (SurfaceView) this.findViewById(R.id.CameraView); 
     surfaceHolder = cameraView.getHolder(); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     surfaceHolder.addCallback(this); 

     cameraView.setFocusable(true); 
     cameraView.setFocusableInTouchMode(true); 
     cameraView.setClickable(true); 
     cameraView.setOnClickListener(this); 

     inflater = LayoutInflater.from(getBaseContext()); 
     viewControl = inflater.inflate(R.layout.camera_control, null); 
     save = (Button) viewControl.findViewById(R.id.vc_btn_keep); 
     retry = (Button)viewControl.findViewById(R.id.vc_btn_discard); 
     layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 



    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     camera.startPreview(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
     try { 
      Camera.Parameters parameters = camera.getParameters(); 
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "portrait"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(90); 
       // Uncomment for Android 2.0 and above 
       // parameters.setRotation(90); 
      } else { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "landscape"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(0); 
       // Uncomment for Android 2.0 and above 
       // parameters.setRotation(0); 
      } 
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
      camera.release(); 
      Log.v("surfaceCreated", exception.getMessage()); 
     } 
     camera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 

     camera.stopPreview(); 
     camera.release(); 
    } 

    @Override 
    public void onPictureTaken(final byte[] data, Camera camera) { 


     this.addContentView(viewControl, layoutParamsControl); 



      save.setOnClickListener(new Button.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        insertImage(data); 
        Intent i = new Intent(); 
        i.putExtra("data", imageFileUri.toString()); 
        setResult(-1, i); 
        finish(); 
       }}); 


     retry.setOnClickListener(new Button.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       finish(); 
      }}); 


    } 

    public void insertImage(byte[] data) 
    { 

     Bitmap b = null; 
     try { 
      b = GeneralUtils.decodeFile(data, this); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     b.compress(Bitmap.CompressFormat.JPEG, 80, bos); 
     //b = null; 
     Bitmap bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size()); 
     Matrix m = new Matrix(); 
     if (b.getWidth() > b.getHeight()) 
     { 
      m.postRotate(90); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); 

     } 
     String result = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", ""); 
     b.recycle(); 
     data = null; 
     b = null; 
     m = null; 

     imageFileUri = Uri.parse(result); 

    } 


    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     camera.takePicture(null, null, null, this); 
    } 

} 
3

ご回答ありがとうございます。

問題が解決しました。これらの行で

:ここ は同じ問題を抱えている人のための答えである

Intent intentPhoto = new Intent(CameraView.this, PhotoView.class); 
intentPhoto.putExtra("lePatient", idPatient); 
intentPhoto.putExtra("laPhoto", data); 
startActivityForResult(intentPhoto, 101); 

intentPhoto.putExtra(」laPhoto「データ)」方法があるため、実行することができません「データ」サイズが大きすぎます。 「データ」には撮影した画像が含まれており、Galaxy SIIでは画像の解像度が非常に高いため、この方法ではデータが送信できません(サイズが制限されているため)。

だから、僕は自分の解像度(1024×768)を定義するために方法をsurfaceChanged、そして今では正常に動作していますsetPictureSize(幅、高さ)法(Camera.Parameters)を使用!

慎重に:前に、独自の解像度を定義し、あなたはそれがgetSupportedPictureSizesを(使用して、デバイスで受け入れられていますことを確認する必要がある)方法

・ホープこれは誰か

関連する問題