安卓在手机上看电视直播的demo(一)(附m3u8直播链接的获取方法)

这个demo主要是为了记录安卓GridView的使用方法。

效果图:

安卓在手机上看电视直播的demo(一)(附m3u8直播链接的获取方法)_第1张图片

视频播放界面:

  • 电视直播m3u8链接的获取

主要就是抓包。在百度搜电视直播,点进一个电视台在线观看,F12查看它的网页源码,转到“Network(网络)”选项卡,F5刷新一遍,找到类似于*.m3u8这样的链接,查看Request URL,这个就是我们需要的播放地址,如下图:

安卓在手机上看电视直播的demo(一)(附m3u8直播链接的获取方法)_第2张图片

由于这些链接随时可能会失效,我就不贴上来了。这里附上北邮ivi测试列表,tv北邮人(IPV6),中科大TV(IPV6)里面有些是高清直播,所以播放会有些卡顿。

  • GridView的使用

GridView使用方法同ListView。

1.在activity_main.xml布局文件里放一个GridView



    
    

2.在item.xml布局文件里设置每一个item的布局




    

    

3.编写javabean

package com.example.tv;

public class TVItem {
	String title;
	String image;
	String url;

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getImage() {
		return image;
	}

	public void setImage(String image) {
		this.image = image;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

4.编写适配器代码

我把直播的链接放在了values下的array.xml文件里,主要有三个节点,结构如下:




    
        香港卫视
    
    
        hkstv
    
    
        http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8
    

title是显示的名称,logo是放在drawable目录下的图片的名称(不带扩展名),url是直播的链接地址

VideoItemAdapter.java

package com.example.tv;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class VideoItemAdapter extends BaseAdapter {
	List list;
	Context context;
	LayoutInflater inflater;
	Handler handler;

	public VideoItemAdapter(Context context, Handler handler) {
		this.handler = handler;// handler根据需要来传,这里没有用到
		this.context = context;
		inflater = LayoutInflater.from(context);
		getTvItems();
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	private void getTvItems() {
		list = new ArrayList();
		Resources resources = context.getResources();
		String[] title = resources.getStringArray(R.array.title);
		String[] url = resources.getStringArray(R.array.url);
		String[] logo = resources.getStringArray(R.array.logo);
		for (int i = 0; i < title.length; i++) {
			TVItem tvItem = new TVItem();
			tvItem.setTitle(title[i]);
			tvItem.setUrl(url[i]);
			tvItem.setImage(logo[i]);
			list.add(tvItem);
		}
	}

	// 重写getView方法,即设置GridView每一项的视图
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;

		if (convertView == null) {
			convertView = inflater.inflate(R.layout.main_item, null);
			holder = new ViewHolder(convertView);
			convertView.setTag(holder);// 设置tag
		} else {
			holder = (ViewHolder) convertView.getTag(); // 获取tag
		}
		holder.name.setText(list.get(position).getTitle());
		//根据图片名称动态获取资源ID
		int resId = context.getResources().getIdentifier(list.get(position).getImage(), "drawable",
				context.getPackageName());
		holder.thumbnail.setImageResource(resId);
		return convertView;
	}

	// 用于暂时保存视图对象
	class ViewHolder {
		public TextView name;
		public ImageView thumbnail;

		public ViewHolder(View view) {
			name = (TextView) view.findViewById(R.id.item_textView);
			thumbnail = (ImageView) view.findViewById(R.id.item_imageView);
		}
	}
}

5.在MainActivity设置适配器,并监听item点击事件

package com.example.tv;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private GridView lv_main;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv_main = findViewById(R.id.lv_main);
		lv_main.setAdapter(new VideoItemAdapter(MainActivity.this, null));
		lv_main.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView parent, View view, int position, long id) {
				// TODO 自动生成的方法存根
				TVItem item = (TVItem) parent.getItemAtPosition(position);
				Intent intent = new Intent(MainActivity.this, VideoActivity.class);
				intent.setData(Uri.parse(item.getUrl()));
				startActivity(intent);
			}
		});
	}
}

上面的步骤完成后,点击MainActivity里的电视台,会跳转到VideoActivity进行播放。这里我用的视频播放器不是安卓原生的mediaplayer,而是开源项目PLDroidPlayer,这个用起来比较简单,只要将jar包、so库导入到项目即可(如果用PLVideoView还要有MediaController.java),具体使用方法请百度。

VideoActivity.java

package com.example.tv;

import com.pili.pldroid.player.widget.PLVideoView;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;

public class VideoActivity extends Activity {

	private PLVideoView plVideoview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 去除标题栏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 去除状态栏
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.activity_video);
		Uri uri = getIntent().getData();
		plVideoview = findViewById(R.id.plVideoview);
		plVideoview.setVideoURI(uri);
		plVideoview.setMediaController(new MediaController(VideoActivity.this));
		// 设置全屏播放
		plVideoview.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_PAVED_PARENT);
		plVideoview.start();
	}
	@Override
	protected void onPause() {
		// TODO 自动生成的方法存根
		plVideoview.pause();
		super.onPause();
	}
}

activity_video.xml



    
    

最后别忘了在清单文件添加权限

AndroidManifest.xml




    

    

    
        
            
                

                
            
        
        
        
    

 

你可能感兴趣的:(Java/安卓)