java.lang.IllegalArgumentException异常:宽度和高度必须是> 0时设置位图 [英] java.lang.IllegalArgumentException: width and height must be > 0 when setting bitmap

查看:3642
本文介绍了java.lang.IllegalArgumentException异常:宽度和高度必须是> 0时设置位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到以下错误的设备上的Galaxy Nexus(金枪鱼)的Nexus 4(鲭)的Nexus 7(FLO)的Xperia Z(C6603),但我的设备注2 4.1.1工作正常。我在做什么用我的声音文件展示台,以显示他们的音频文件的用户爽图般的反馈。

我使用 com.pheelicks.visualizer 在我的应用程序,它工作正常我的设备,但它有崩溃了我的一些用户。这是我很难测试,因为我没有一个新的设备,但如果有人可以证实为什么我收到错误,我将不胜AP preciate吧!我注意到肯定是否有什么关系呢,但我也开始与视图作为view.GONE知名度,然后将其设置为可见时,时间是正确的,然后启动动画。我会在下方,以防万一,这是什么问题这个code。

  java.lang.IllegalArgumentException异常:宽度和高度必须是> 0
在android.graphics.Bitmap.createBitmap(Bitmap.java:695)
在android.graphics.Bitmap.createBitmap(Bitmap.java:674)
在android.graphics.Bitmap.createBitmap(Bitmap.java:641)
在com.pheelicks.visualizer.VisualizerView.onDraw(VisualizerView.java:193)
在android.view.View.draw(View.java:13944)
在android.view.View.getDisplayList(View.java:12838)
在android.view.View.getDisplayList(View.java:12880)
在android.view.View.draw(View.java:13657)
在android.view.ViewGroup.drawChild(ViewGroup.java:3083)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
在android.view.View.draw(View.java:13947)
在android.view.View.getDisplayList(View.java:12838)
在android.view.View.getDisplayList(View.java:12880)
在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
在android.view.View.getDisplayList(View.java:12775)
在android.view.View.getDisplayList(View.java:12880)
在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
在android.view.View.getDisplayList(View.java:12775)
在android.view.View.getDisplayList(View.java:12880)
在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
在android.view.View.getDisplayList(View.java:12775)
在android.view.View.getDisplayList(View.java:12880)
在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
在android.view.View.getDisplayList(View.java:12775)
在android.view.View.getDisplayList(View.java:12880)
在android.view.HardwareRenderer $ GlRenderer.buildDisplayList(HardwareRenderer.java:1411)
在android.view.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:1359)
在android.view.ViewRootImpl.draw(ViewRootImpl.java:2367)
在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2239)
在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5481)
在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:749)
在android.view.Choreographer.doCallbacks(Choreographer.java:562)
在android.view.Choreographer.doFrame(Choreographer.java:532)
在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:735)
在android.os.Handler.handleCallback(Handler.java:730)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:5103)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)

有关参考这里是custome VisualizerView

 公共类VisualizerView扩展视图{
 私有静态最后弦乐TAG =VisualizerView;
 私人布尔isLinked = FALSE;
 私人字节[]字节;
 私人字节[] mFFTBytes;
 私人矩形mRect =新的矩形();
 私人展示台mVisualizer; 私人设置<&渲染GT; mRenderers; 私人油漆mFlashPaint =新的油漆();
 私人油漆mFadePaint =新的油漆(); 公共VisualizerView(上下文的背景下,ATTRS的AttributeSet,INT defStyle)
 {
  超(背景下,ATTRS);
  在里面();
 } 公共VisualizerView(上下文的背景下,ATTRS的AttributeSet)
 {
   这(背景下,ATTRS,0);
 } 公共VisualizerView(上下文的背景下)
 {
   这(背景下,NULL,0);
 } 私人无效的init(){
   兆字节= NULL;
   mFFTBytes = NULL;   mFlashPaint.setColor(Color.argb(122,255,255,255));
   mFadePaint.setColor(Color.argb(150,255,255,255)); //调整阿尔法改变图像褪色的速度有多快
   mFadePaint.setXfermode(新PorterDuffXfermode(Mode.MULTIPLY));   mRenderers =新的HashSet<&渲染GT;();
 }
 / **
  *链接的可视化工具,以一个球员
  * @参数的球员 - 比如的MediaPlayer链接
  * /
 公共无效链接(MediaPlayer的播放器)
 {
   如果(球员== NULL)
   {
    抛出新的NullPointerException异常(无法链接到空的MediaPlayer);
   }   //创建可视化对象,并将其连接到我们的媒体播放器。
   mVisualizer =新的可视化工具(player.getAudioSessionId());
   mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);   //通过可视化的数据VisualizerView传递
   Visualizer.OnDataCaptureListener captureListener =新Visualizer.OnDataCaptureListener()
   {
     @覆盖
     公共无效onWaveFor​​mDataCapture(可视化可视化工具,字节[]字节,
         INT采样速率)
     {
       updateVisualizer(字节);
     }     @覆盖
     公共无效onFftDataCapture(可视化可视化工具,字节[]字节,
      INT采样速率)
     {
      updateVisualizerFFT(字节);
     }
   };   mVisualizer.setDataCaptureListener(captureListener,
       Visualizer.getMaxCaptureRate()/ 2,真实,真实);    //展台启用和禁用当我们与流完成
   mVisualizer.setEnabled(真);
   player.setOnCompletionListener(新MediaPlayer.OnCompletionListener()
   {
     @覆盖
     公共无效onCompletion(MediaPlayer的媒体播放器)
     {
      mVisualizer.setEnabled(假);
    }
   });   this.setLinked(真);
  } 公共无效addRenderer(渲染器渲染)
 {
   如果(渲染!= NULL)
   {
    mRenderers.add(渲染);
   }
 } 公共无效clearRenderers()
 {
   mRenderers.clear();
 } / **
  *呼吁释放被VisualizerView使用的资源。想与
  * MediaPlayer的是很好的做法,调用此方法
  * /
 公共无效发行()
 {
   mVisualizer.release();
   this.setLinked(假);
 }
 / **
   *将数据传递给可视化工具。通常,这会从得到
   * Android的Visualizer.OnDataCaptureListener回拨。看到
   * {@link Visualizer.OnDataCaptureListener#onWaveFor​​mDataCapture}
   * @参数字节
   * /
 公共无效updateVisualizer(字节[]字节){
   兆字节=字节;
   无效();
 }  / **
  *通FFT数据可视化工具。通常,这会从得到
  * Android的Visualizer.OnDataCaptureListener回拨。看到
  * {@link Visualizer.OnDataCaptureListener#onFftDataCapture}
  * @参数字节
  * /
  公共无效updateVisualizerFFT(字节[]字节){
    mFFTBytes =字节;
    无效();
   }    布尔mFlash = FALSE;  / **
  *调用此做出可视化闪光灯。有用的,在启动闪光
  *一首歌曲/循环等...
  * /
  公共无效闪光灯(){
    mFlash = TRUE;
    无效();
  }    位图mCanvasBitmap;
     帆布mCanvas;
  @覆盖
  保护无效的onDraw(帆布油画){
   super.onDraw(画布);   //创建帆布一旦我们准备好绘制
   mRect.set(0,0,的getWidth(),的getHeight());   如果(mCanvasBitmap == NULL)
   {
     mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Config.ARGB_8888); //这就是发生异常
   }
   如果(mCanvas == NULL)
   {
     mCanvas =新的Canvas(mCanvasBitmap);
   }   如果(兆字节!= NULL){
     //渲染所有的音频渲染器
     AudioData audioData =新AudioData(兆字节);
     对于(渲染R:mRenderers)
     {
       r.render(mCanvas,audioData,mRect);
     }
   }   如果(mFFTBytes!= NULL){
     //渲染所有的渲染器FFT
     FFTData fftData =新FFTData(mFFTBytes);
     对于(渲染R:mRenderers)
     {
       r.render(mCanvas,fftData,mRect);
     }
   }   //淡出旧的内容
   mCanvas.drawPaint(mFadePaint);   如果(mFlash)
   {
     mFlash = FALSE;
     mCanvas.drawPaint(mFlashPaint);
   }   canvas.drawBitmap(mCanvasBitmap,新的Matrix(),NULL);
 } 公共布尔isLinked(){
  返回isLinked;
  } 私人无效setLinked(布尔isLinked){
this.isLinked = isLinked;
  }
}

在OnCreate中活动(在visualizer_container有里面的visualizerView)

  this.visualizer_container =(RelativeLayout的)findViewById(R.id.visualizer_layout);
this.visualizer_container.setVisibility(View.GONE);

后来在活动

  sAnimation = AnimationUtils.loadAnimation(这一点,R.anim.slide_bottom);
            sAnimation.setInterpolator(新AccelerateInterpolator());
            sAnimation.setStartOffset(400);
            sAnimation.setDuration(1000);
            this.mVisualizerView.setAnimation(sAnimation);


解决方案

您在code评论是错误的,这是失败的线(在堆栈跟踪你可以看到,未来呼叫Bitmap.createBitmap( )):

  mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Config.ARGB_8888);

的问题是,要么canvas.getWidth()或canvas.getHeight(),或两者​​,返回0。这是不允许的。反过来,这是你在注释标明的路线,其中的getWidth()/的getHeight()返回0引起

我想补充一点,这些打印日志报表,所以你可以看到,如果只发生在第一次或始终。如果只发生第一次,你也许可以忽略它(例如检查的宽度和高度> 0)。

更新:考虑到你最终要画到画布上,为什么不使用画布宽度和高度

  mRect.set(0,0,canvas.getWidth(),canvas.getHeight());

I am getting the following error on devices Galaxy Nexus (maguro),Nexus 4 (mako),Nexus 7 (flo), Xperia Z (C6603) but my device Note2 4.1.1 works fine. What I am doing is using a Visualizer with my sound file to show the user cool graph-like feedback from their audio files.

I am using com.pheelicks.visualizer in my app and it works fine on my device but it has been crashing for some of my users. This is hard for me to test since I don't have a new device, but if someone can confirm why I am getting the error I would greatly appreciate it! I am note sure if it has anything to do with it, but I also start with the view's visibility as view.GONE and then set it to visible when the time is right, and then start an animation. I will include this code below just in case this is what is the problem.

java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.createBitmap(Bitmap.java:695)
at android.graphics.Bitmap.createBitmap(Bitmap.java:674)
at android.graphics.Bitmap.createBitmap(Bitmap.java:641)
at com.pheelicks.visualizer.VisualizerView.onDraw(VisualizerView.java:193)
at android.view.View.draw(View.java:13944)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12880)
at android.view.View.draw(View.java:13657)
at android.view.ViewGroup.drawChild(ViewGroup.java:3083)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2920)
at android.view.View.draw(View.java:13947)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12880)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
at android.view.View.getDisplayList(View.java:12775)
at android.view.View.getDisplayList(View.java:12880)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
at android.view.View.getDisplayList(View.java:12775)
at android.view.View.getDisplayList(View.java:12880)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
at android.view.View.getDisplayList(View.java:12775)
at android.view.View.getDisplayList(View.java:12880)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3057)
at android.view.View.getDisplayList(View.java:12775)
at android.view.View.getDisplayList(View.java:12880)
at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1411)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1359)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2367)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2239)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

For Reference here is the custome VisualizerView

 public class VisualizerView extends View {
 private static final String TAG = "VisualizerView";
 private boolean isLinked = false;
 private byte[] mBytes;
 private byte[] mFFTBytes;
 private Rect mRect = new Rect();
 private Visualizer mVisualizer;

 private Set<Renderer> mRenderers;

 private Paint mFlashPaint = new Paint();
 private Paint mFadePaint = new Paint();

 public VisualizerView(Context context, AttributeSet attrs, int defStyle)
 {
  super(context, attrs);
  init();
 }

 public VisualizerView(Context context, AttributeSet attrs)
 {
   this(context, attrs, 0);
 }

 public VisualizerView(Context context)
 {
   this(context, null, 0);
 }

 private void init() {
   mBytes = null;
   mFFTBytes = null;

   mFlashPaint.setColor(Color.argb(122, 255, 255, 255));
   mFadePaint.setColor(Color.argb(150, 255, 255, 255)); // Adjust alpha to change how quickly the image fades
   mFadePaint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY));

   mRenderers = new HashSet<Renderer>();
 }
 /**
  * Links the visualizer to a player
  * @param player - MediaPlayer instance to link to
  */
 public void link(MediaPlayer player)
 {
   if(player == null)
   {
    throw new NullPointerException("Cannot link to null MediaPlayer");
   }

   // Create the Visualizer object and attach it to our media player.
   mVisualizer = new Visualizer(player.getAudioSessionId());
   mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);

   // Pass through Visualizer data to VisualizerView
   Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener()
   {
     @Override
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
         int samplingRate)
     {
       updateVisualizer(bytes);
     }

     @Override
     public void onFftDataCapture(Visualizer visualizer, byte[] bytes,
      int samplingRate)
     {
      updateVisualizerFFT(bytes);
     }
   };

   mVisualizer.setDataCaptureListener(captureListener,
       Visualizer.getMaxCaptureRate() / 2, true, true);

    // Enabled Visualizer and disable when we're done with the stream
   mVisualizer.setEnabled(true);
   player.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
   {
     @Override
     public void onCompletion(MediaPlayer mediaPlayer)
     {
      mVisualizer.setEnabled(false);
    }
   });

   this.setLinked(true);
  }

 public void addRenderer(Renderer renderer)
 {
   if(renderer != null)
   {
    mRenderers.add(renderer);
   }
 }

 public void clearRenderers()
 {
   mRenderers.clear();
 }

 /**
  * Call to release the resources used by VisualizerView. Like with the
  * MediaPlayer it is good practice to call this method
  */
 public void release()
 {
   mVisualizer.release();
   this.setLinked(false);
 }
 /**
   * Pass data to the visualizer. Typically this will be obtained from the
   * Android Visualizer.OnDataCaptureListener call back. See
   * {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture }
   * @param bytes
   */
 public void updateVisualizer(byte[] bytes) {
   mBytes = bytes;
   invalidate();
 }

  /**
  * Pass FFT data to the visualizer. Typically this will be obtained from the
  * Android Visualizer.OnDataCaptureListener call back. See
  * {@link Visualizer.OnDataCaptureListener#onFftDataCapture }
  * @param bytes
  */
  public void updateVisualizerFFT(byte[] bytes) {
    mFFTBytes = bytes;
    invalidate();
   }

    boolean mFlash = false;

  /**
  * Call this to make the visualizer flash. Useful for flashing at the start
  * of a song/loop etc...
  */
  public void flash() {
    mFlash = true;
    invalidate();
  }

    Bitmap mCanvasBitmap;
     Canvas mCanvas;


  @Override
  protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);

   // Create canvas once we're ready to draw
   mRect.set(0, 0, getWidth(), getHeight());  

   if(mCanvasBitmap == null)
   {
     mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888); // THIS IS WHERE THE ERROR IS OCCURRING
   }
   if(mCanvas == null)
   {
     mCanvas = new Canvas(mCanvasBitmap);
   }

   if (mBytes != null) {
     // Render all audio renderers
     AudioData audioData = new AudioData(mBytes);
     for(Renderer r : mRenderers)
     {
       r.render(mCanvas, audioData, mRect);
     }
   }

   if (mFFTBytes != null) {
     // Render all FFT renderers
     FFTData fftData = new FFTData(mFFTBytes);
     for(Renderer r : mRenderers)
     {
       r.render(mCanvas, fftData, mRect);
     }
   }

   // Fade out old contents
   mCanvas.drawPaint(mFadePaint);

   if(mFlash)
   {
     mFlash = false;
     mCanvas.drawPaint(mFlashPaint);
   }

   canvas.drawBitmap(mCanvasBitmap, new Matrix(), null);
 }

 public boolean isLinked() {
  return isLinked;
  }

 private void setLinked(boolean isLinked) {
this.isLinked = isLinked;
  }
}

OnCreate in Activity (the visualizer_container has the visualizerView inside it)

this.visualizer_container = (RelativeLayout) findViewById(R.id.visualizer_layout);
this.visualizer_container.setVisibility(View.GONE);

Later in activity

sAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_bottom);
            sAnimation.setInterpolator(new AccelerateInterpolator());
            sAnimation.setStartOffset(400);
            sAnimation.setDuration(1000);


            this.mVisualizerView.setAnimation(sAnimation);

解决方案

Your comment in the code is wrong, this is the line that fails (in the stacktrace you can see that the next call is Bitmap.createBitmap()):

mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888);

The problem is that either canvas.getWidth() or canvas.getHeight() , or both, return 0. That is not allowed. In turn, that is caused by the line you indicate in the comment, in which getWidth()/getHeight() returns 0.

I would add a log statements that prints these, so you can see if it only happens the first time, or always. If it only happens the first time, you might be able to ignore it (e.g. check if width and height > 0).

Update: considering you eventually have to draw to the canvas, why not use the canvas' width and height?

mRect.set(0, 0, canvas.getWidth(), canvas.getHeight());  

这篇关于java.lang.IllegalArgumentException异常:宽度和高度必须是&GT; 0时设置位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆