Android 2.3.3 Eclipse Version: 3.7.0 LogCat emulator-5554
虚拟机,采用VideoView 播放视频。
弹出错误提示:无法播放视频。很抱歉,无法播放此视频。
LogCat 报错信息:
02-09 17:57:08.470: INFO/StagefrightPlayer(34): setDataSource('sdcard/video/taobao.avi') 02-09 17:57:08.501: ERROR/MediaPlayer(6606): error (1, -2147483648) 02-09 17:57:08.609: ERROR/MediaPlayer(6606): Error (1,-2147483648) 02-09 17:57:08.609: DEBUG/VideoView(6606): Error: 1,-2147483648 02-09 17:57:24.489: ERROR/MediaPlayer(6606): stop called in state 0 02-09 17:57:24.489: ERROR/MediaPlayer(6606): error (-38, 0) 02-09 17:57:24.600: WARN/MediaPlayer(6606): mediaplayer went away with unhandled events
发生错误原因分析:将视频文件类型由AVI文件类型更改为3GP文件类型,可以播放。但即使播放3GP类型文件,在找不到此文件时,也报错。
因此,至少有两种原因会引起此错误:
1、播放文件不存在;
2、硬件不支持此播放文件;
解决办法:
在Activity中添加视频错误监听器,监听视频播放过程产生的错误,并作相应处理。
public OnErrorListener videoErrorListener = new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // 播放出错处理 …… return true; } };
在播放部分设置此监听器。
VideoView htcVideoView = (VideoView) findViewById(R.id.htcVideoView); htcVideoView.setOnErrorListener(videoErrorListener);
RROR/AndroidRuntime(4522): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(4522): at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:90)
这表示,要在activity里面直接调用
如果还不行,那就查看权限,我测试代码如下,android2.3.3
ContentValues values = new ContentValues(); Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); values.put(StructuredName.GIVEN_NAME, "Sullivan"); values.put(StructuredName.FAMILY_NAME, "Mike"); getContentResolver().insert(Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "13989297343"); values.put(Phone.TYPE, Phone.TYPE_HOME); values.put(Email.DATA, "ligang.02@163.com"); values.put(Email.TYPE, Email.TYPE_WORK); getContentResolver().insert(Data.CONTENT_URI, values);
前段时间根据朋友的一个提议做了个翻页动画。效果跟水果忍者切割相似。如图
效果过程大致如下:
1)根据手势痕迹将当前图片分割为两部分;
2)将分割后的图片拉开一段距离,并适度放大图片,以模拟向屏幕外弹起效果,同时露出底层图片;
3)错位移动分割后的图片;
首先遇到的问题是如何对图片进行分割。我选择采用canvas.clipPath来实现;采用这种方法就要先确定PATH中各个节点的坐标;
起初我尝试利用分割线与图片边的交点,以及图片的顶点来确定Path;
如下图:
通过观察,却发现交点可以落在图片任意两条不同的边上,而且落点不同与其构成Path的顶点也不同,情况复杂,于是我果断放弃,另谋他路。一番尝试后,我决定采用以下方式;
设mHW为图片对角线的斜率,mSlope分割线的斜率;;
将切割情况分为,mSlope大于还是小于mHW两种情况进行处理;
先看mSlope大于mHW的情况,如图:
点mDown 和mUp分别表示手指按下和弹起时的位置,两点所在直线即为分割线。分割线与x=-mWidth,x=2mWidth分别交于mX0 和mXw;显然两点坐标可以轻松得到:
private void calcPoints() { mSlope = (mDown.y - mUp.y) / (mDown.x - mUp.x); mX0.x = -mWidth; mX0.y = (-mWidth - mUp.x) * mSlope + mUp.y; mXw.x = 2 * mWidth; mXw.y = mSlope * (2 * mWidth - mUp.x) + mUp.y; }
这样,被分割的两部分路径就总是可以用图中Part1,Part2 两个三角形确定。
Part1的路径为:
if (Math.abs(mSlope) > mHW) { if (mSlope < 0) { path.moveTo(-mWidth, mXw.y); path.lineTo(mXw.x, mXw.y); path.lineTo(mX0.x, mX0.y); path.close(); } else { path.moveTo(-mWidth, mXw.y); path.lineTo(mX0.x, mX0.y); path.lineTo(mXw.x, mXw.y); path.close(); } }
Part2的路径为:
if (Math.abs(mSlope) > mHW) { if (mSlope < 0) { path.moveTo(2 * mWidth, mX0.y); path.lineTo(mXw.x, mXw.y); path.lineTo(mX0.x, mX0.y); path.close(); } else { path.moveTo(2 * mWidth, mX0.y); path.lineTo(mX0.x, mX0.y); path.lineTo(mXw.x, mXw.y); path.close(); } }
而当切割线斜率小于mSlope时,情况与此相似,就不一一赘述了。