2015-09-28 12 views
6

新しいPaletteクラスを使用してコードをいくつか持っていますが、これらのクラッシュレポートには、width and height must be > 0というクラッシュレポートがあります。android.support.v7.graphics.Paletteの幅と高さは> 0でなければなりません

if(bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){ 
    //do something 
}else{ 
    Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener() { 
..... 
} 

だから私はちょうど突然のビットマップすべてが右の高さや幅を持っていない可能性があるかを確認していない:何奇妙なことは、これは私がパレットコードを呼び出す方法であるということです。私のコードのどの部分が例外であるのかわからないのは、レポートにはパレットクラス内のものしか含まれていないからです。ここで

は例外です:

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:300) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.IllegalArgumentException: width and height must be > 0 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:815) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:794) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:725) 
     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:601) 
     at android.support.v7.graphics.Palette.scaleBitmapDown(Palette.java:282) 
     at android.support.v7.graphics.Palette.access$100(Palette.java:67) 
     at android.support.v7.graphics.Palette$Builder.generate(Palette.java:557) 
     at android.support.v7.graphics.Palette$Builder$1.doInBackground(Palette.java:623) 
     at android.support.v7.graphics.Palette$Builder$1.doInBackground(Palette.java:620) 
     at android.os.AsyncTask$2.call(AsyncTask.java:288) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 

私はcom.android.support:palette-v7:23+

から間違っているかもしれないものの任意のアイデアをパレットクラスを使用していますか?

+0

です:あなたは、キーの色を抽出するために、高解像度の画像を必要としないので、ちょうどあなたのオリジナルのものから作成された低解像度のビットマップを提供本当にビットマップが何かを持っているか、または表示されていることを本当に確認しますか?パレットは画像を分析しなければならず、数ms後に色を取得します。 –

+0

さて、私はCrashlytics以上のエラーしか出ません。私には起こりません。しかし、パレットコードを呼び出す前にnullとandのサイズをチェックしています。 – casolorz

+0

アプリがクラッシュすることはありませんか?問題を再現できますか?そうでない場合は...多分一部のユーザーがローエンドのスマートフォンを持っていて、タスクが時間がかかり過ぎてパレットがヌル値を見つけました(パレット上で、ビットマップ上でクラッシュする) –

答えて

0

実際にレイアウトに追加される前に、UI要素の幅と高さにアクセスしようとしている可能性があります。

これは、要素が実際には存在しないため、幅と高さが0になっている理由です。 myViewがあなたのビットマップ

+0

私はそれにアクセスしようとしていない、 'パレット'クラスです。そして、 'Palette'クラスを呼び出す前に、幅と高さとヌルを調べています。私は 'Palette'コードを変更することはできません。どうすればこれが起こらないのか確認できますか? – casolorz

+0

TreeObserver内のPaletteクラスを呼び出します。こうすることで、パレットクラスがそのビットマップにアクセスしようとする前にビットマップが定義されます。 –

+0

パレットコードを呼び出す前に、これらのビットマップがロードされているというビューは実際にはありません。私はパレットの色を知った後、それらをビューにロードします。これは、ほとんどのユーザーにとってうまく機能し、毎日20,000人のユーザーから1日に4回または5回のクラッシュが発生するだけです。 – casolorz

0

私はあなたのコードはすべての問題を持っているとは思わないだろう

使用ViewTreeObserver http://developer.android.com/reference/android/view/ViewTreeObserver.html

myView.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() { 
       public boolean onPreDraw() { 

         int finalHeight = myView.getMeasuredHeight(); 
         int finalWidth = myView.getMeasuredWidth(); 
         // Do your work here 


        return true; 
       } 
      }); 

。あなたが投稿したStackTraceを見ていました。

at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:601) 
at android.support.v7.graphics.Palette.scaleBitmapDown(Palette.java:282) 

あなたがPalette.javaのソースコードを見れば、あなたは方法scaleBitmapDown(Bitmap bitmap)で書かれたスケーリングロジックがあります。 'ビットマップ'が100ピクセル未満の場合、スケーリングは行われません。しかし、あなたの 'ビットマップ'が100pxより大きい場合、Bitmap.createScaledBitmap()が呼び出されます。このメソッドは、幅または高さが0の場合はIllegalArgumentExceptionをスローします。< 0;

したがって、渡しているビットマップの幅がゼロでない場合は、Bitmap.createScaledBitmap()メソッドにまったく到達していないでしょう。それが言われている、私は本当の理由が何であるかわからない。使用している正確なPalette.javaのソースコードを調べてみてください。

+0

貼り付けられたスタックトレースをクリックしたときにAndroid Studioが私に与えるパレットのコードは、少し異なりますが、見ているチェックと同じです。私は、チェックとスケーリングの間のビットマップに何かが起こったかどうかは、唯一の可能性があると思います。 – casolorz

+0

私の推測も。特定のバージョンの特定のデバイスでクラッシュが発生していますか?その場合、おそらくOSバージョンコードにバグがあります。しかし、いずれにせよ、私はあなたがそれについて何もしないと思います。 – Henry

0

問題を並行処理の問題に関連している:あなたは「非同期」方法でPaletteを使用しているので、あなたが

Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener() 

を起動したときに、あなたのビットマップは有効ですが、Paletteはビットマップを使用する場合それ自身の非同期ロジックでは、ビットマップはnullであるか、または有効ではなくなります(同時操作のため)。

この問題の簡単な修正はあります:あなたは

if(bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){ 
    //do something 
}else{ 
    //This resized bitmap is just an example: you should keep your bitmap 
    //aspect ratio, and keep width and height < 100 
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, 100, 100, false); 
    Palette.Builder(resizedBitmap).generate(new Palette.PaletteAsyncListener() { 
..... 
} 
+0

面白いアイデア、私はそれを試してみましょう。ありがとう。 – casolorz

+0

@mntgoatサイズ変更されたビットマップにアスペクト比を維持することを忘れないでください。間違ったキーカラーが表示されることがあります(例では100x100pxを強制します)。 – bonnyz

+0

ええ。私が実際にパレットクラスのために見ているコードは、最小値として192を使用しています。 – casolorz

関連する問題