添加权限
<uses-permission android:name="android.permission.READ_TV_LISTINGS" />
添加这个权限之后需要手动前往系统设置 > 设置 > 应用 > app > 权限 > 开启读取所有电视节目频道权限,否则不能成功读取数据 原因:在官方文档中这个permission的 protectionLevel 是 “dangerous”,所以需要手动去开启 官网链接:https://cs.android.com/android/platform/superproject/+/master:packages/providers/TvProvider/AndroidManifest.xml;l=23-26
com.android.providers.tv.permission.READ_EPG_DATA com.android.providers.tv.permission.WRITE_EPG_DATA 这两个权限是在自己实现一个TvInputInfo时需要用到的,只能读取与写入自己的数据
所以这个是第三方app唯一能够读取所有TvProvider数据库中数据的权限 接着就可以使用ContentResolver去获取数据了
获取数据:
Cursor cursor = context.getContentResolver().query(TvContract.Channels.CONTENT_URI, null, null, null, null, null);
String[] columnNames = cursor.getColumnNames();
for (String columnName : columnNames) {
try{
String value = cursor.getString(cursor.getColumnIndex(columnName));
Log.d(TAG, "queryChannel:columnName:" + columnName + " --- value:" + value);
}catch (Exception e){
byte[] value = cursor.getBlob(cursor.getColumnIndex(columnName));
Log.d(TAG, "queryChannel:columnName:" + columnName + " --- value:" + value);
}
}
这里try一下是因为在TvProvider中的节目视频数据是存放在 TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA 这个Key中,value是byte类型
这个TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA中的数据是由系统开发者定义的,按照官方的源码是可以通过
JSONObject json = new JSONObject(new String(value))
获取到当前频道的节目信息,也不一定能够成功,这个看系统了
播放TvProvider中的视频
TvView tvView = new TvView(context);
tvView.reset();
tvView.tune(input_id, _id);
参数:
input_id: 根据数据库查询到的 input_id _id:数据库中的_id
到此就能实现播放了
也能够通过
TvInputManager tvInputManager = (TvInputManager) getSystemService(TV_INPUT_SERVICE);
List<TvInputInfo> tvInputList = tvInputManager.getTvInputList();
for (TvInputInfo tvInputInfo : tvInputList) {
Log.d(TAG, "onCreate: " + tvInputInfo.getId());
}
的方式获取到Tv上面的所有输入源input_id
一个TvInputInfo代表一个输入源,一个电视接口也代表一个输入源,例如Dvb接口,hdmi接口,第三方app也能够开发TvInputInfo
可以通过adb logcat -v -time > log.txt 的方式查看日志来确定你的电视dvb接口或者HDMI接口的input_id是什么
|