优化播放控制

This commit is contained in:
sifacai@outlook.com 2022-08-25 00:59:45 +08:00
parent 83d06aa630
commit 021424c37f
10 changed files with 219 additions and 80 deletions

2
.idea/misc.xml generated
View File

@ -4,10 +4,12 @@
<option name="filePathToZoomLevelMap"> <option name="filePathToZoomLevelMap">
<map> <map>
<entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/ic_outline_play_circle_outline_128.xml" value="0.1555" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/ic_outline_play_circle_outline_128.xml" value="0.1555" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/played_percentage.xml" value="0.1765" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/popmenu_focus.xml" value="0.1555" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/popmenu_focus.xml" value="0.1555" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/shape_user_focus_vholder.xml" value="0.1555" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/drawable/shape_user_focus_vholder.xml" value="0.1555" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/activity_detail.xml" value="0.14583333333333334" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/activity_detail.xml" value="0.14583333333333334" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/activity_vlc_player.xml" value="0.286231884057971" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/activity_vlc_player.xml" value="0.286231884057971" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/item_h.xml" value="0.16770833333333332" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/item_v.xml" value="0.14583333333333334" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/item_v.xml" value="0.14583333333333334" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/popmenu.xml" value="0.14479166666666668" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/popmenu.xml" value="0.14479166666666668" />
<entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/popmenu_item.xml" value="0.14479166666666668" /> <entry key="..\:/code/VlcJellyfin/app/src/main/res/layout/popmenu_item.xml" value="0.14479166666666668" />

View File

@ -7,6 +7,7 @@ import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -18,6 +19,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import me.jessyan.autosize.internal.CustomAdapt; import me.jessyan.autosize.internal.CustomAdapt;
public class BaseActivity extends AppCompatActivity implements CustomAdapt { public class BaseActivity extends AppCompatActivity implements CustomAdapt {
@ -48,10 +52,33 @@ public class BaseActivity extends AppCompatActivity implements CustomAdapt {
return 0; return 0;
} }
public void showLoadingDialog(String msg) {
mAA.runOnUiThread(new Runnable() {
@Override
public void run() {
showLoadingDialog(1);
setLoadingText(msg);
}
});
}
public void showLoadingDialog() {
mAA.runOnUiThread(new Runnable() {
@Override
public void run() {
showLoadingDialog(1);
}
});
}
/** /**
* 显示加载动画框 * 显示加载动画框
*/ */
public void showLoadingDialog() { public void showLoadingDialog(int i) {
if (null != alertDialogLoading && alertDialogLoading.isShowing()) {
alertDialogLoading.dismiss();
}
alertDialogLoading = new AlertDialog.Builder(this).create(); alertDialogLoading = new AlertDialog.Builder(this).create();
alertDialogLoading.getWindow().setBackgroundDrawable(new ColorDrawable()); alertDialogLoading.getWindow().setBackgroundDrawable(new ColorDrawable());
alertDialogLoading.setCancelable(false); alertDialogLoading.setCancelable(false);
@ -71,10 +98,19 @@ public class BaseActivity extends AppCompatActivity implements CustomAdapt {
alertDialogLoading.setCanceledOnTouchOutside(false); alertDialogLoading.setCanceledOnTouchOutside(false);
} }
public void dismissLoadingDialog() {
mAA.runOnUiThread(new Runnable() {
@Override
public void run() {
dismissLoadingDialog(1);
}
});
}
/** /**
* 隐藏加载框 * 隐藏加载框
*/ */
public void dismissLoadingDialog() { public void dismissLoadingDialog(int i) {
if (null != alertDialogLoading && alertDialogLoading.isShowing()) { if (null != alertDialogLoading && alertDialogLoading.isShowing()) {
alertDialogLoading.dismiss(); alertDialogLoading.dismiss();
} }
@ -85,9 +121,14 @@ public class BaseActivity extends AppCompatActivity implements CustomAdapt {
* @param text * @param text
*/ */
public void setLoadingText(String text){ public void setLoadingText(String text){
if (null != alertDialogLoading && alertDialogLoading.isShowing()) { mAA.runOnUiThread(new Runnable() {
TextView tv = alertDialogLoading.getWindow().getDecorView().findViewById(R.id.progressText); @Override
tv.setText(text); public void run() {
} if (null != alertDialogLoading && alertDialogLoading.isShowing()) {
TextView tv = alertDialogLoading.getWindow().getDecorView().findViewById(R.id.progressText);
tv.setText(text);
}
}
});
} }
} }

View File

@ -76,13 +76,11 @@ public class JAdapter extends RecyclerView.Adapter {
JsonObject ujo = jo.get("UserData").getAsJsonObject(); JsonObject ujo = jo.get("UserData").getAsJsonObject();
if(ujo.has("PlayedPercentage")){ if(ujo.has("PlayedPercentage")){
int pp = ujo.get("PlayedPercentage").getAsInt(); int pp = ujo.get("PlayedPercentage").getAsInt();
v.tvPlayedPercentage.setVisibility(View.VISIBLE);
v.tvPlayedPercentage.setMax(100);
v.tvPlayedPercentage.setProgress(pp); v.tvPlayedPercentage.setProgress(pp);
v.tvPlayedPercentage.setVisibility(View.VISIBLE);
} }
} }
if(jo.has("CollectionType")){ if(jo.has("CollectionType")){
v.type = jo.get("CollectionType").getAsString(); v.type = jo.get("CollectionType").getAsString();
} }

View File

@ -62,8 +62,8 @@ public class MainActivity extends BaseActivity {
@Override @Override
public void run() { public void run() {
//showLoading("正在加载首页,请稍候…………"); //showLoading("正在加载首页,请稍候…………");
showLoadingDialog(); showLoadingDialog("正在加载首页,请稍候…………");
setLoadingText("正在加载首页,请稍候…………"); tvContiner.removeAllViews();
} }
}); });
@ -299,6 +299,7 @@ public class MainActivity extends BaseActivity {
* @return * @return
*/ */
private boolean ValidUrl(String url) { private boolean ValidUrl(String url) {
//showLoadingDialog("正在验证服务器地址!");
boolean valid = false; boolean valid = false;
if (url.length() > 0) { if (url.length() > 0) {
if (url.startsWith("http://") || url.startsWith("https://")) { if (url.startsWith("http://") || url.startsWith("https://")) {
@ -320,6 +321,7 @@ public class MainActivity extends BaseActivity {
} }
} }
} }
//dismissLoadingDialog();
return false; return false;
} }
@ -333,8 +335,8 @@ public class MainActivity extends BaseActivity {
private boolean authenticateByName(String username, String password) { private boolean authenticateByName(String username, String password) {
String url = "/Users/authenticatebyname"; String url = "/Users/authenticatebyname";
String reqjson = "{\"Username\":\"" + username + "\",\"Pw\":\"" + password + "\"}"; String reqjson = "{\"Username\":\"" + username + "\",\"Pw\":\"" + password + "\"}";
//showLoadingDialog("正在验证用户名和密码!");
String userinfo = Utils.okhttpSend(url, reqjson); String userinfo = Utils.okhttpSend(url, reqjson);
Log.d(TAG, "authenticateByName: " + userinfo);
if (userinfo.length() > 0) { if (userinfo.length() > 0) {
JsonObject userObj = new Gson().fromJson(userinfo, JsonObject.class); JsonObject userObj = new Gson().fromJson(userinfo, JsonObject.class);
String userId = userObj.getAsJsonObject("User").get("Id").getAsString(); String userId = userObj.getAsJsonObject("User").get("Id").getAsString();
@ -345,21 +347,14 @@ public class MainActivity extends BaseActivity {
return true; return true;
} }
} }
//dismissLoadingDialog();
return false; return false;
} }
@Override @Override
protected void onResume() { protected void onResume() {
if(!Utils.AccessToken.equals("")){ if(!Utils.AccessToken.equals("")){
tvLoginOut.setVisibility(View.VISIBLE); showLogoutBtn();
tvLoginOut.setText("注 销");
tvLoginOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
logout();
}
});
} }
super.onResume(); super.onResume();
} }

View File

@ -74,8 +74,13 @@ public class PopMenu extends PopupWindow {
public void show(int index){ public void show(int index){
show(); show();
if(index >=0 && index < items.size()) { // if(index >=0 && index < items.size()) {
items.get(index).v.requestFocus(); // items.get(index).v.requestFocus();
// }
for (menu m:items) {
if(m.id == index){
m.v.requestFocus();
}
} }
} }

View File

@ -0,0 +1,56 @@
package org.sifacai.vlcjellyfin;
import android.annotation.SuppressLint;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class RxUtils {
@SuppressLint("TrulyRandom")
public static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory sSLSocketFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllManager()},
new SecureRandom());
sSLSocketFactory = sc.getSocketFactory();
} catch (Exception ignored) {
}
return sSLSocketFactory;
}
public static class TrustAllManager implements X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
public static class TrustAllHostnameVerifier implements HostnameVerifier {
@SuppressLint("BadHostnameVerifier")
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}

View File

@ -1,5 +1,8 @@
package org.sifacai.vlcjellyfin; package org.sifacai.vlcjellyfin;
import static android.net.sip.SipErrorCode.TIME_OUT;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
@ -9,9 +12,21 @@ import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.Headers; import okhttp3.Headers;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
@ -51,7 +66,12 @@ public class Utils {
}else{ }else{
url = JellyfinUrl + url; url = JellyfinUrl + url;
} }
OkHttpClient client = new OkHttpClient(); OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient client = builder.sslSocketFactory(RxUtils.createSSLSocketFactory())
.hostnameVerifier(new RxUtils.TrustAllHostnameVerifier())
.retryOnConnectionFailure(true).build();
//OkHttpClient client = new OkHttpClient();
String xea = XEmbyAuthorization; String xea = XEmbyAuthorization;
if(AccessToken != ""){ if(AccessToken != ""){
@ -125,9 +145,9 @@ public class Utils {
* 报告播放开始 * 报告播放开始
* @param PositionTicks * @param PositionTicks
*/ */
public static void ReportPlaying(long PositionTicks){ public static void ReportPlaying(String Id,long PositionTicks){
String url = JellyfinUrl + "/Sessions/Playing"; String url = JellyfinUrl + "/Sessions/Playing";
String json = "{\"itemId\":\"" + playList.get(playIndex).Id + "\",\"PositionTicks\":\"" + PositionTicks * 10000 + "\"}"; String json = "{\"itemId\":\"" + Id + "\",\"PositionTicks\":\"" + PositionTicks * 10000 + "\"}";
okhttpSend(url,json); okhttpSend(url,json);
} }
@ -136,8 +156,8 @@ public class Utils {
* @param paused * @param paused
* @param PositionTicks * @param PositionTicks
*/ */
public static void ReportPlaybackProgress(boolean paused, long PositionTicks) { public static void ReportPlaybackProgress(String Id,boolean paused, long PositionTicks) {
String json = "{\"itemId\" : \"" + playList.get(playIndex).Id + "\",\"canSeek\" : \"true\",\"isPaused\":\"" + paused + "\",\"isMuted\":\"false\","; String json = "{\"itemId\" : \"" + Id + "\",\"canSeek\" : \"true\",\"isPaused\":\"" + paused + "\",\"isMuted\":\"false\",";
json += "\"positionTicks\": \"" + PositionTicks * 10000 + "\",\"PlayMethod\":\"DirectPlay\"}"; json += "\"positionTicks\": \"" + PositionTicks * 10000 + "\",\"PlayMethod\":\"DirectPlay\"}";
String url = JellyfinUrl + "/Sessions/Playing/Progress"; String url = JellyfinUrl + "/Sessions/Playing/Progress";
okhttpSend(url,json); okhttpSend(url,json);
@ -147,9 +167,9 @@ public class Utils {
* 播放停止 * 播放停止
* @param PositionTicks * @param PositionTicks
*/ */
public static void ReportPlaybackStop(long PositionTicks) { public static void ReportPlaybackStop(String Id,long PositionTicks) {
String url = JellyfinUrl + "/Sessions/Playing/Stopped"; String url = JellyfinUrl + "/Sessions/Playing/Stopped";
String json = "{\"itemId\":\"" + playList.get(playIndex).Id + "\",\"PositionTicks\":\"" + PositionTicks * 10000 + "\"}"; String json = "{\"itemId\":\"" + Id + "\",\"PositionTicks\":\"" + PositionTicks * 10000 + "\"}";
okhttpSend(url,json); okhttpSend(url,json);
} }
@ -175,4 +195,5 @@ public class Utils {
} }
return ""; return "";
} }
} }

View File

@ -55,7 +55,8 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
private ImageView pauseFlag; private ImageView pauseFlag;
private SeekBar currPostion; private SeekBar currPostion;
private Timer progressTime = null; private Timer progressTime = null; //控制器进度条更新定时
private Timer reportProcessTime = null; // 报告进度定时器
private PopMenu playListMenu = null; //播放列表 private PopMenu playListMenu = null; //播放列表
private PopMenu subTrackMenu = null; //字幕菜单 private PopMenu subTrackMenu = null; //字幕菜单
@ -65,6 +66,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
private float speedRate[] = {0.5f, 1.0f, 1.5f, 2.0f}; //倍速播放列表 private float speedRate[] = {0.5f, 1.0f, 1.5f, 2.0f}; //倍速播放列表
private long currPlaybackTimeTrack = 0; //当前播放进度
private int ReportTime = 20; // 报告进度间隔次数 private int ReportTime = 20; // 报告进度间隔次数
private int ReportVal = 0; //累积次数 private int ReportVal = 0; //累积次数
@ -98,14 +100,15 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
Hide(); Hide();
pauseFlag.setVisibility(View.GONE); pauseFlag.setVisibility(View.GONE);
Log.d(TAG, "onEvent: 打开成功"); Log.d(TAG, "onEvent: 打开成功");
ReportPlayState(Utils.ReportType.playing); ReportPlayState(Utils.ReportType.playing, Utils.playList.get(Utils.playIndex).Id);
initMenu(); initMenu();
break; break;
case MediaPlayer.Event.Paused: //暂停 case MediaPlayer.Event.Paused: //暂停
pauseFlag.setVisibility(View.VISIBLE); pauseFlag.setVisibility(View.VISIBLE);
break; break;
case MediaPlayer.Event.Stopped: case MediaPlayer.Event.Stopped:
ReportPlayState(Utils.ReportType.stop); Log.d(TAG, "onEvent: 播放停止");
ReportPlayState(Utils.ReportType.stop, Utils.playList.get(Utils.playIndex).Id);
playNext(); playNext();
break; break;
case MediaPlayer.Event.Opening: //媒体打开 case MediaPlayer.Event.Opening: //媒体打开
@ -117,7 +120,6 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
} }
setLoadingText("加载进度:%" + Buffering); setLoadingText("加载进度:%" + Buffering);
if (Buffering >= 100) { if (Buffering >= 100) {
Log.d(TAG, "onEvent: 取消loading");
dismissLoadingDialog(); dismissLoadingDialog();
} }
break; break;
@ -128,14 +130,9 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
Log.d(TAG, "onEvent: EncounteredError"); Log.d(TAG, "onEvent: EncounteredError");
break; break;
case MediaPlayer.Event.TimeChanged://视频时间变化 case MediaPlayer.Event.TimeChanged://视频时间变化
ReportVal += 1; currPlaybackTimeTrack = event.getTimeChanged();
if(ReportVal > ReportTime){
ReportPlayState(Utils.ReportType.Progress);
ReportVal = 0;
}
break; break;
case MediaPlayer.Event.PositionChanged://视频总时长的百分比 case MediaPlayer.Event.PositionChanged://视频总时长的百分比
Log.d(TAG, "onEvent: 百分之:" + mediaPlayer.getPosition());
break; break;
case MediaPlayer.Event.SeekableChanged: case MediaPlayer.Event.SeekableChanged:
break; break;
@ -204,7 +201,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
} }
/** /**
* 初始化字幕和轨菜单 * 初始化字幕和轨菜单
*/ */
private void initMenu() { private void initMenu() {
MediaPlayer.TrackDescription[] subTrackList = mediaPlayer.getSpuTracks(); MediaPlayer.TrackDescription[] subTrackList = mediaPlayer.getSpuTracks();
@ -281,6 +278,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
public void onClick(View view) { public void onClick(View view) {
playListMenu.dismiss(); playListMenu.dismiss();
if (m.id != Utils.playIndex) { if (m.id != Utils.playIndex) {
ReportPlayState(Utils.ReportType.stop,Utils.playList.get(Utils.playIndex).Id);
Utils.playIndex = m.id; Utils.playIndex = m.id;
play(); play();
} }
@ -298,7 +296,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
private void initSubTrackMenu(MediaPlayer.TrackDescription[] subTrackList) { private void initSubTrackMenu(MediaPlayer.TrackDescription[] subTrackList) {
subTrackMenu = new PopMenu(this, subTracksBtn); subTrackMenu = new PopMenu(this, subTracksBtn);
for (int i = 0; i < subTrackList.length; i++) { for (int i = 0; i < subTrackList.length; i++) {
PopMenu.menu m = subTrackMenu.add(Type_SubtitleTrack, i, i, subTrackList[i].name); PopMenu.menu m = subTrackMenu.add(Type_SubtitleTrack, subTrackList[i].id, i, subTrackList[i].name);
m.v.setOnClickListener(new View.OnClickListener() { m.v.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -312,10 +310,15 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
subTracksBtn.setOnClickListener(this); subTracksBtn.setOnClickListener(this);
} }
/**
* 初始化音轨菜单
*
* @param audioTrackList
*/
private void initAudioTrackMenu(MediaPlayer.TrackDescription[] audioTrackList) { private void initAudioTrackMenu(MediaPlayer.TrackDescription[] audioTrackList) {
audioTrackMenu = new PopMenu(this, audioTracksBtn); audioTrackMenu = new PopMenu(this, audioTracksBtn);
for (int i = 0; i < audioTrackList.length; i++) { for (int i = 0; i < audioTrackList.length; i++) {
PopMenu.menu m = audioTrackMenu.add(Type_SubtitleTrack, i, i, audioTrackList[i].name); PopMenu.menu m = audioTrackMenu.add(Type_SubtitleTrack, audioTrackList[i].id, i, audioTrackList[i].name);
m.v.setOnClickListener(new View.OnClickListener() { m.v.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -351,7 +354,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
mActivity.runOnUiThread(new Runnable() { mActivity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
setSeekBar(mediaPlayer.getTime()); setSeekBar(currPlaybackTimeTrack);
} }
}); });
} }
@ -412,6 +415,7 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
* 播放下一集 * 播放下一集
*/ */
public void playNext() { public void playNext() {
ReportPlayState(Utils.ReportType.stop, Utils.playList.get(Utils.playIndex).Id);
Utils.playIndex += 1; Utils.playIndex += 1;
play(); play();
} }
@ -420,17 +424,18 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
* 上一集 * 上一集
*/ */
public void playPre() { public void playPre() {
ReportPlayState(Utils.ReportType.stop, Utils.playList.get(Utils.playIndex).Id);
if (Utils.playIndex > 0) { if (Utils.playIndex > 0) {
Utils.playIndex -= 1; Utils.playIndex -= 1;
play(); play();
} }
} }
/** /**
* 停止播放并结束Activity * 停止播放并结束Activity
*/ */
public void stop() { public void stop() {
ReportPlayState(Utils.ReportType.stop, Utils.playList.get(Utils.playIndex).Id);
if (progressTime != null) { if (progressTime != null) {
progressTime.cancel(); progressTime.cancel();
progressTime = null; progressTime = null;
@ -540,17 +545,32 @@ public class VlcPlayerActivity extends BaseActivity implements MediaPlayer.Event
} }
} }
private void ReportPlayState(Utils.ReportType type){ private void ReportPlayState(Utils.ReportType type, String Id) {
long currplaytime = mediaPlayer.getTime(); if (type == Utils.ReportType.playing) {
reportProcessTime = new Timer();
reportProcessTime.schedule(new TimerTask() {
@Override
public void run() {
ReportPlayState(Utils.ReportType.Progress, Utils.playList.get(Utils.playIndex).Id);
}
}, 1000, 10000);
} else if (type == Utils.ReportType.stop) {
if (reportProcessTime != null) {
reportProcessTime.cancel();
reportProcessTime = null;
}
}
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
if(type == Utils.ReportType.playing){ if (type == Utils.ReportType.playing) {
Utils.ReportPlaying(currplaytime); Utils.ReportPlaying(Id, currPlaybackTimeTrack);
}else if(type == Utils.ReportType.stop){ } else if (type == Utils.ReportType.stop) {
Utils.ReportPlaybackStop(currplaytime); Utils.ReportPlaybackStop(Id, currPlaybackTimeTrack);
}else if(type == Utils.ReportType.Progress){ } else if (type == Utils.ReportType.Progress) {
Utils.ReportPlaybackProgress(!mediaPlayer.isPlaying(),currplaytime); Log.d(TAG, "run: 报告时空:" + currPlaybackTimeTrack);
Utils.ReportPlaybackProgress(Id, !mediaPlayer.isPlaying(), currPlaybackTimeTrack);
} }
} }
}).start(); }).start();

View File

@ -23,7 +23,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:background="@color/color_99000000" android:background="@color/color_99000000"
android:padding="1dp"> android:padding="1dp"
android:orientation="vertical">
<TextView <TextView
android:id="@+id/tvName" android:id="@+id/tvName"
@ -35,20 +36,20 @@
android:gravity="center" android:gravity="center"
android:singleLine="true" /> android:singleLine="true" />
<SeekBar
android:id="@+id/tvPlayedPercentage"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:progress="0"
android:layout_gravity="bottom"
android:paddingEnd="0dp"
android:paddingStart="0dp"
android:thumb="@null"
android:progressDrawable="@drawable/played_percentage"
android:visibility="gone"/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
<SeekBar
android:id="@+id/tvPlayedPercentage"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:progress="0"
android:layout_gravity="bottom"
android:paddingEnd="0dp"
android:paddingStart="0dp"
android:thumb="@null"
android:progressDrawable="@drawable/played_percentage"
android:visibility="gone"/>
</FrameLayout> </FrameLayout>

View File

@ -35,21 +35,21 @@
android:gravity="center" android:gravity="center"
android:singleLine="true" /> android:singleLine="true" />
<SeekBar
android:id="@+id/tvPlayedPercentage"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:progress="0"
android:layout_gravity="bottom"
android:paddingEnd="0dp"
android:paddingStart="0dp"
android:thumb="@null"
android:progressDrawable="@drawable/played_percentage"
android:visibility="gone"/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
<SeekBar
android:id="@+id/tvPlayedPercentage"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:progress="0"
android:layout_gravity="bottom"
android:paddingEnd="0dp"
android:paddingStart="0dp"
android:thumb="@null"
android:progressDrawable="@drawable/played_percentage"
android:visibility="gone"/>
</FrameLayout> </FrameLayout>