pointerIndex out of range Android multitouch
Solution 1
My problem was that it was actually calling event.getX(1) when there wasn't actually two ids. So I made sure that there were two ids with event.getPointerCount() >= 2 and it now works. Maybe you'll have the same luck!
Solution 2
For those who are still looking for answers please note that this may happen also when you are using any ViewPager with some Zooming or Scaling features on image etc inside it. Then there is a possibility you can get this Exception as well.
Solution:
Extend the existing ViewPager and override these methods with try catch.
@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
Solution 3
Your missing a few things, you need to apply the mask to the pointer otherwise as you are not technically accessing the ID of the finger you think you are
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
Solution 4
I'm also having this error but none of the solutions before the date of my post work. The only temporary pseudo-fix which works for me is to use a try-catch against IllegalArgumentException.
According to Android Issue 18990, it is related to ScaleGestureDetector and a fix has been committed few days ago.
Solution 5
The original posting is using the pointer id when the getX
and getY
use the pointer index.
It appears to work when you use the ID for a single touch because the id and the index are both 0. It will mess up if you use a multi-touch because the indices can change.
Example:
-
Touch 1 Down.
Touch 1 State Index=0. ID=0 -
Touch 2 Down.
Touch 1 State Index=0. ID=0
Touch 2 State Index=1. ID=1 -
Touch 1 Release.
Touch 2 State Index=0. ID=1
Try the following code:
int action = event.getAction();
int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
Related videos on Youtube
DRiFTy
Updated on July 09, 2022Comments
-
DRiFTy almost 2 years
I have a touch event exception that is causing my game to crash on tablets (or more specifically, honeycomb)... My game works fine on my phone and I haven't heard of this happening to anyone that isn't running Android 3.0 or higher. Here is the relevant log info...
E/AndroidRuntime(26487): java.lang.IllegalArgumentException: pointerIndex out of range E/AndroidRuntime(26487): at android.view.MotionEvent.nativeGetAxisValue(Native Method) E/AndroidRuntime(26487): at android.view.MotionEvent.getX(MotionEvent.java:1549) E/AndroidRuntime(26487): at kieran.android.asteroids.GameUI.onTouchEvent(GameUI.java:665) E/AndroidRuntime(26487): at android.view.View.dispatchTouchEvent(View.java:4616) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
... And here is the code that is calling it. Seems fine to me, but maybe there is a bug in honeycomb that hasn't been fixed yet? The line number 665 from the log above corresponds to the
float x = event.getX(id);
line. It must have something to do with the way I am getting thewhich
variable maybe? But it works fine on the phones/2.3 and lower...int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; if(actionCode == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_UP) { int which = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; int id = event.getPointerId(which); float x = event.getX(id); float y = event.getY(id);
Any help/ideas would be greatly appreciated as I am trying to make my game available to tablet users as well. Thanks.
-
Peterdk over 12 yearsYes, I have exactly the same problem on HoneyComb only with my mini piano. On phones it's just behaving normally.
-
-
DRiFTy almost 13 yearsHmmmm... I understand what you mean. Though after changing it I still get the same error. The error is coming from the getX() method. Which I logged the pointer index before passing to that function and it is usually just a positive 1, 2, or 3 etc..., depending on which pointer it was. Any other ideas?
-
Chris almost 13 yearsare you using event.getX(pointerIndex) now? getY is probably doing the same thing its just not getting that far in the code. Does this crash when you touch the screen? If so how many touches does it take to break it
-
Chris almost 13 yearsAlso where is this code being called? Is it just within onTouch?
-
DRiFTy almost 13 yearsYes I am using event.getX(pointerIndex) now, and yea I'm positive getY() would do the same but it's obviously crashing just before that. It takes 2 touches to break it, I put one pointer down, then put a second down, then bring the first up and it crashes. And yes just within the onTouchEvent(). I don't quite understand it because it works on my phone but not my tablet.
-
Chris almost 13 yearsRun in debug and see what values pointerIndex and pointerID return just before the crash
-
DRiFTy almost 13 yearsOk so I logged the values just before the crash and it is returning pointerIndex=0 and pointerId=1... the code looks exactly the same as what you posted above.
-
DRiFTy over 12 yearsDamnnn no go on that either... I had high hopes for this to work. It's hard to believe that I haven't found a solution to this problem yet, I can't be the only one that has had this problem. I've tried so many things...
-
DRiFTy over 12 yearsYou are awesome! That is exactly my problem. I am still unsure as to why I don't have this problem on phones but for now this has fixed my force close problem. Thanks a lot!
-
Someone Somewhere almost 11 yearsthis is the best solution! Using the Pointer Index calculations that are suggested by David and Chris will prevent zoom-in and zoom-out on the Samsung Note 2
-
RAHULRSANNIDHI about 10 yearsiam using findPointerIndex() getActionMasked() but still getting crash in multitouch.
-
Steve Luck about 8 yearsno luck for me, I applied ev.getPointerCount() > 10 in onInterceptTouchEvent but it still crashed
-
Sirop4ik almost 5 yearsPerfect solution
-
zaheer ahmed about 4 yearsYou are awesome! That is exactly my problem.
-
Oleksandr Albul about 3 yearsI also use ScaleGestureDetector. But even if this bug is fixed, how could we back-port this solution to our builds?
-
hata over 2 yearsThanks to this answer, I found the fact that there are
pointerIndex
andpointerId
and the arguments ofgetX
andgetY
are the former. That was what I had overlooked for a long time.