2016-05-19 20 views
0

を返すときに、私はに、ユーザーがネイティブカメラを使って写真を撮るか、からのものを選ぶことができますプログラムを構築するために、過去二、三日のためにしようとしている時にアプリを殺すデッドロックギャラリー。いずれかの方法から画像を取得した後、画像は処理のためにコア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 

答えて

1

です。あなたがカメラから画像を保存したい意思、それ以外の場合は何も保存されていない教える:

File file = new File(Environment.getExternalStorageDirectory() + IMAGE_FOLDER + File.separator + "temp_image.jpg"); 
          takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
          takePictureIntent.putExtra(PhotoStatics.OUTPUT_FORMAT, Bitmap.CompressFormat.JPEG.toString()); 
          startActivityForResult(takePictureIntent, PhotoStatics.REQUEST_IMAGE_CAPTURE); 

をそして、我々は写真が行われたときのために耳を傾け、私たちは保存するためにカメラを告げた場所からそれをつかみます画像...

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    //System.out.println("onActivityResult = " + requestCode + " " + resultCode + " " + intent.getAction()); 

    // Photo incoming 
    if (requestCode == PhotoStatics.REQUEST_IMAGE_CAPTURE) { 
     if (resultCode == RESULT_OK) { // check if we have something to work with 

      File file = new File(Environment.getExternalStorageDirectory() + IMAGE_FOLDER + File.separator + "temp_image.jpg"); 
      Uri image_uri = Uri.fromFile(file); // get where the temp is stored 
      Bitmap imageBitmap = BitmapFactory.decodeFile(image_uri.getPath()); 
     } 
    } 
} 

これは意味がありますか?

// Static Globals 
public static final String TEMP_IMAGE = "temp_image"; 
public static final String OUTPUT_FORMAT = "outputFormat"; 
public static final String IMAGE_FOLDER = "/these_pictures"; // don't forget the/at the beginning. 
public static final int REQUEST_IMAGE_CAPTURE = 12; // just internal use. 
public static final String IMAGE_TYPE = ".jpg"; 
+0

ありがとうございました!私はそれを試して、あなたに戻ってきます! – user6355815

+0

PhotoStatics.OUTPUT_FORMATとは何ですか? – user6355815

+0

私が使用している統計情報を追加しました。 – Flummox

関連する問題