我的应用程序是Air应用程序,它使用Starling引擎并播放流式视频。
由于Starling并不能很好地支持视频播放,所以我决定采用原生方式编写ANE进行视频播放。
我使用VideoView启动一个新的Activity来显示视频,并且在调用MediaController.show()时,在较新的Androids(测试的API级别19和18)上,应用程序崩溃。我没有有用的堆栈跟踪,因为Android位被编译为本机扩展。 在较旧的设备上(在API级别15和9上测试),MediaController工作得很好。
我还尝试用播放/暂停ImageView替换MediaController,再次,它在旧设备上工作正常,而在较新的设备上,它在显示的图像上播放一次,第二次没有显示图像(对象仍然创建和布局的孩子)和第三次应用程序崩溃。
在较新的设备上,如果我移除了ImageView,应用程序不会崩溃,以及如果我保留附加的ImageView,并且不要调用requestWindowFeature(Window.FEATURE_NO_TITLE)。
这是适用于旧设备的代码(使用MediaController):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//this works proven with Android API Level 15 and lower. On Kitkat and 4.3 it blows up (18 and above)
if(Build.VERSION.SDK_INT <= 15)
requestWindowFeature(Window.FEATURE_NO_TITLE);
int resourceId = PlayVideoFunction.ctx.getResourceId("layout.main");
setContentView(resourceId);
Log.d("NativeExtension", "OnCreate " + this.toString());
Log.d("NativeExtension", "On Resume");
String url = getIntent().getStringExtra("url");
Log.d("NativeExtension", "url " + url);
int videoViewId = PlayVideoFunction.ctx.getResourceId("id.videoView");
videoView = (VideoView) findViewById(videoViewId);
videoView.setVideoURI(Uri.parse(url));
videoView.setOnCompletionListener(this);
videoView.setOnErrorListener(this);
videoView.setOnPreparedListener(this);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
mediaController.setMediaPlayer(videoView);
videoView.setMediaController(mediaController);
}
是否有人遇到与原生扩展相关的类似问题?我的猜测是,它必须在Android和Air / Starling中使用Window对象。除此之外,我输了。
编辑:在这里发布logcat(要粘贴的字符太多) http://pastebin.com/tnuEgWFA
答案 0 :(得分:0)
我放弃了弄清楚它崩溃的原因,最终有两种处理视频播放的方法。
在较新的设备上(Jelly Bean及以上)我只是在设备上启动默认视频播放器来观看视频。他们可以处理切换回Air井。
然而,在较旧的设备上,我正在本机扩展中显示视频 - 使用VideoView和MediaController。这样,当您通过Android的GC离开它时,我不必冒风险/椋鸟应用程序被杀死。