を返すときに、私はに、ユーザーがネイティブカメラを使って写真を撮るか、からのものを選ぶことができますプログラムを構築するために、過去二、三日のためにしようとしている時にアプリを殺すデッドロックギャラリー。いずれかの方法から画像を取得した後、画像は処理のためにコアlibgdxプロジェクトに戻されます。ギャラリーからのピッキングは魅力のように機能します。そして、の画像をに取り込み、サムネイルとして返すと完全に動作します。LIBGDX、アンドロイド:キャプチャした画像
ただし、サムネイルの代わりにサイズを変更した写真を使用したいと思います。アプリケーションは「AndroidGraphics:deadlock kill」エラーでクラッシュし続けます。コードは言葉よりも大きく語ります。
public void takePicture() {
selectedImagePath = null;
selectedByteArray = null;
/* when thumbnail
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(intent.resolveActivity(getPackageManager())!=null) {
startActivityForResult(intent, SELECT_TAKEPICTURE_CODE);
}
*/
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = timeStamp + ".jpg";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
File file = new File(pictureImagePath);
Uri outputFileUri = Uri.fromFile(file);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, SELECT_TAKEPICTURE_CODE);
}
アクティビティの処理。テクスチャに[]バイトから変換するため
if(gameMode==GameMode.setTextureFromCapturedPicture) {
float imageSize = 100; boolean smoothFilter = true; int quality = 10;
texture = byteArrayToTexture(rootApp.galleryOpener.getCapturedPictureAsByteArray(imageSize, smoothFilter, quality));
gameMode = GameMode.play;
}
コアゲーム側のコードの粗いバージョン
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==RESULT_CANCELED||data==null) {
didUserCancel = true;
}
/* Also for the thumbnail use
if (requestCode == SELECT_TAKEPICTURE_CODE&&resultCode==RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
selectedByteArray = convertBitmapToByteArray(imageBitmap);
}
*/
if (requestCode == SELECT_TAKEPICTURE_CODE&&resultCode==RESULT_OK) {
File imgFile = new File(pictureImagePath);
if (imgFile.exists()) {
pictureCaptured = true;
}
}
}
三ヘルパーメソッド今
private Bitmap scaleDownBitmap(Bitmap realImage, float maxImageSize, boolean filter) {
float ratio = Math.min(maxImageSize/(float)realImage.getWidth(),
maxImageSize/(float)realImage.getHeight());
int width = Math.round(ratio * (float)realImage.getWidth());
int height = Math.round(ratio * (float)realImage.getHeight());
Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width, height, filter);
return newBitmap;
}
private byte[] convertBitmapToByteArray(Bitmap bmp, int quality) {
if(quality>100)
quality = 100;
if(quality<0)
quality = 0;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, quality, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
@Override
public byte[] getCapturedPictureAsByteArray(float imageSize, boolean smoothFilter, int quality) {
Bitmap bitmap = getBitmapFromPath(pictureImagePath);
Bitmap scaledDownBitmap = scaleDownBitmap(bitmap, imageSize, smoothFilter);
selectedByteArray = convertBitmapToByteArray(scaledDownBitmap, quality);
return selectedByteArray;
}
。
エラーは、私はlibgdxの前の画面(私の場合はメニュー画面)に戻ってきます。私が電話のギャラリーを検索すると、私はその写真を見つけて問題なく見ることができます。さらに、ゲームを再実行して最後に選択した画像を選択すると、次のように動作します。■
悲しい点は、繰り返しエラーを生成できないことです。それはちょうどクラッシュします。しかし、私は取得しています最も頻繁にエラーが、私はそれを行う方法がこれです
com.*.*.game/Zygote: v2
com.*.*.game E/Zygote: accessInfo : 0
OR
com.*.*.game waiting for pause synchronization took too long; assuming deadlock and killing
ありがとうございました!私はそれを試して、あなたに戻ってきます! – user6355815
PhotoStatics.OUTPUT_FORMATとは何ですか? – user6355815
私が使用している統計情報を追加しました。 – Flummox