安卓网页视频抓取工具(继承IntentService服务子类中进行主线程中播放黑屏问题的方法)
优采云 发布时间: 2022-01-31 14:17安卓网页视频抓取工具(继承IntentService服务子类中进行主线程中播放黑屏问题的方法)
这个视频播放器不能播放视频,有时候黑屏问题是我最近在这个项目中遇到的最头疼的问题,因为不知道是哪个链接出错了,在网上也找不到任何线索。最后发现是因为我在manifest里打开页面的时候,加了硬件加速,是加了android:hardwareAccelerated="true"引起的。移除视频后,视频可以正常播放。我认为应该在后台完成。前端够用了,但有时需要我们自己获取。一般在实际开发中,我们会获取不止一个,比如视频列表的所有视频缩略图。在做这个需求的时候,我发现获取的过程是一个耗时的过程。直接在主线程进行操作的时候会很卡,还会出现程序崩溃的问题,所以我认为这个过程是在子线程中进行的,把得到的图片位图返回给UI线程,获取并加载一个。体验问题也好很多。下面是具体的实现过程: 这里,耗时的任务是在IntentService服务的子类中进行的,和线程中的操作原理是一样的。一、创建MyIntentService,并创建UpdateUI接口,页面回调数据使用二、在onHandleIntent中获取图片URL后,通过MediaMetadataRetriever获取位图返回页面 并且会出现程序崩溃的问题,所以我认为这个过程是在子线程中进行的,将获取到的图像位图返回给UI线程,获取并加载一个。体验问题也好很多。下面是具体的实现过程: 这里,耗时的任务是在IntentService服务的子类中进行的,和线程中的操作原理是一样的。一、创建MyIntentService,并创建UpdateUI接口,页面回调数据使用二、在onHandleIntent中获取图片URL后,通过MediaMetadataRetriever获取位图返回给页面 并且会出现程序崩溃的问题,所以我认为这个过程是在子线程中进行的,将获取到的图像位图返回给UI线程,获取并加载一个。体验问题也好很多。下面是具体的实现过程: 这里,耗时的任务是在IntentService服务的子类中进行的,和线程中的操作原理是一样的。一、创建MyIntentService,并创建UpdateUI接口,页面回调数据使用二、在onHandleIntent中获取图片URL后,通过MediaMetadataRetriever获取位图返回页面 获取并加载一个。体验问题也好很多。下面是具体的实现过程: 这里,耗时的任务是在IntentService服务的子类中进行的,和线程中的操作原理是一样的。一、创建MyIntentService,并创建UpdateUI接口,页面回调数据使用二、在onHandleIntent中获取图片URL后,通过MediaMetadataRetriever获取位图返回页面 获取并加载一个。体验问题也好很多。下面是具体的实现过程: 这里,耗时的任务是在IntentService服务的子类中进行的,和线程中的操作原理是一样的。一、创建MyIntentService,并创建UpdateUI接口,页面回调数据使用二、在onHandleIntent中获取图片URL后,通过MediaMetadataRetriever获取位图返回页面
package ui.zlz.fragment;
import android.app.IntentService;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.os.Message;
import android.support.annotation.Nullable;
import java.util.HashMap;
/**
* created by yezhengyu on 2019/1/21 09:26
*/
public class MyIntentService extends IntentService {
public static UpdateUI updateUI;
public static void setUpdateUI(UpdateUI updateUIInterface){
updateUI=updateUIInterface;
}
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
*/
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
public interface UpdateUI{
void updateUI(Message message);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
String image = intent.getStringExtra("image");
int index = intent.getIntExtra("index", 0);
MediaMetadataRetriever retr = new MediaMetadataRetriever();
retr.setDataSource(image, new HashMap());
Bitmap bitmap = retr.getFrameAtTime();
Message msg1 = new Message();
msg1.what = index;
msg1.obj = bitmap;
if(updateUI!=null) {
updateUI.updateUI(msg1);
}
}
}
三、获取图片数据后启动MyIntentService,页面需要实现UpdateUI接口
<p>Intent intent = new Intent(getActivity(), MyIntentService.class);
for (int i = 0; i