私は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();
}
}
誰も私を助けてくださいことはできますか?読書のための
感謝:)以下
が例外を投稿助けることができます。何が起こっている?それはクラッシュですか?または写真を撮った後でデータが返されないのですか? – Jack
ああ、すみません、私はその部分を忘れました^^。さて、私が画面に触れているとき、私は写真が撮られていると思う(私は音が聞こえ、オートフォーカスがある)が、その後私に写真を撮ったのではなく、カメラに戻る私の写真を保存することはできません。私は私の電話アルバムをチェックしましたが、この写真もここにはありません。私は問題が "onAutoFocus"メソッドから来て、 "PhotoView"クラス(他のデバイスではうまく動作しますが、私が言ったようにGalaxy Sではうまく動作しません)を呼び出す必要があると思います。 =>申し訳ありませんが私の英語が悪い場合は、私の母国語ではありません^^ – Vince
アップ?誰も私を助けることができますか? :(:( – Vince