关键代码:
在activity中写入如下代码:
private ScheduledThreadPoolExecutor exec;//线程池
private VerticalAdapter vAdapter1;//垂直ViewPager的adapter
private VerticalViewPager verticalPager1;//垂直ViewPager
private List<View> pageViews;//存放imageview的List
private List<String> mediaUrls;// 音乐和图片url
private Button play;// 播放按钮
/**
* true 播放音乐 false 停止播放
*/
boolean isPlaying = false;
private MediaPlayer mPlayer;
private SharedPreferences sp;
/**
* true 请求JSON数据 false 不请求
*/
public boolean isRequest = true;
private SeekBar seekBar1;//
private Timer timer;
private TimerTask timerTask;
private boolean isChanging = false;// 互斥变量,防止定时器与SeekBar拖动时进度冲突
private int currentItem = 0;// 当前页面
// 得到音乐和图片的url
protected static final int SUCCESS_GET_URL = 1;
// 读取缓存文件后刷新adapter
private static final int CACHEFILE = 2;
// 读取缓存
private static final int LOADMEDIA = 3;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
verticalPager1.setCurrentItem(currentItem);
switch (msg.what) {
case SUCCESS_GET_URL:// 下载数据
loadeMedia();
break;
case CACHEFILE:// 刷新adapter
updateAdapter();
break;
case LOADMEDIA:// 读取缓存
isRequest = false;
readCacheFile();
break;
}
}
// 更新adapter显示图片
private void updateAdapter() {
vAdapter1 = new VerticalAdapter(pageViews);
verticalPager1.setAdapter(vAdapter1);
vAdapter1.notifyDataSetChanged();
findViewById(R.id.loading).setVisibility(View.GONE);
rMedia.setVisibility(View.VISIBLE);
verticalPager1.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
currentItem = position;
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
Log.e("sc", "----position----" + position
+ "----->positionOffset---" + positionOffset
+ "---->positionOffsetPixels---"
+ positionOffsetPixels);
if (position == pageViews.size() - 1) {
verticalPager1.setCurrentItem(0, false);
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == 1 && exec != null) {
if (!exec.isShutdown()) {
Log.e("1", "-----shutdown----");
exec.shutdown();
exec = null;
}
} else if (state == 0) {
Log.e("1", "----start----");
synchronized (_lock) {
if (exec == null) {
exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new ViewPagerTask(),
5, 5, TimeUnit.SECONDS);
}
}
}
}
});
}
};
byte[] _lock = new byte[1];
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sLogger.i("MeetingStartActivity:onCreate");
setContentView(R.layout.splash_activity);
initView();
readCacheFile();
}
@Override
protected void onStart() {
// 用一个定时器 来完成图片切换
// Timer 与 ScheduledExecutorService 实现定时器的效果
// scheduledExecutorService = //Executors.newScheduledThreadPool(3);
exec = new ScheduledThreadPoolExecutor(1);
// 通过定时器 来完成 每2秒钟切换一个图片
// 经过指定的时间后,执行所指定的任务
// scheduleAtFixedRate(command, initialDelay, period, unit)
// command 所要执行的任务
// initialDelay 第一次启动时 延迟启动时间
// period 每间隔多次时间来重新启动任务
// unit 时间单位
// .scheduleAtFixedRate(command, initialDelay, period, unit)
exec.scheduleAtFixedRate(new ViewPagerTask(), 5, 5, TimeUnit.SECONDS);
super.onStart();
}
// 用来完成图片切换的任务
private class ViewPagerTask implements Runnable {
public void run() {
// 实现我们的操作
// 改变当前页面
currentItem = (currentItem + 1) % pageViews.size();
// Handler来实现图片切换
handler.obtainMessage().sendToTarget();
}
}
// 初始化View
private void initView() {
pageViews = new ArrayList<View>();
mediaUrls = new ArrayList<String>();
mPlayer = new MediaPlayer();
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
SystemClock.sleep(1000);
mPlayer.seekTo(0);
play.setBackgroundResource(R.drawable.player);
isPlaying = false;
}
});
verticalPager1 = (VerticalViewPager) findViewById(R.id.pager1);
musicName = (TextView) findViewById(R.id.tv_music_name);
rMedia = (RelativeLayout) findViewById(R.id.rl_media);
downMusic.setOnClickListener(this);
seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
seekBar1.setOnSeekBarChangeListener(this);
// 播放音乐按钮
play = (Button) findViewById(R.id.btn_play);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_play:
playMusic();
break;
}
}
/**
* 播放音乐
*/
private void playMusic() {
if (!isPlaying) {
mPlayer.start();
play.setBackgroundResource(R.drawable.paused);
isPlaying = true;
} else {
mPlayer.pause();
play.setBackgroundResource(R.drawable.player);
isPlaying = false;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChanging = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mPlayer.seekTo(seekBar.getProgress());
isChanging = false;
}
/**
* 读取缓存文件
*/
private void readCacheFile() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
String musicDir = "/sdcard/meeting" + AppConfig.APP_ID + "/music/";
String imageDir = "/sdcard/meeting" + AppConfig.APP_ID + "/image/";
File musDirFile = new File(musicDir);
File imageDirFile = new File(imageDir);
if (!musDirFile.exists()) {
sp = null;
mediaRequest();//异步请求网络音乐和图片的url
} else {// 读取音乐/图片
if (isRequest) {
sp = getSharedPreferences("mediaurl", MODE_PRIVATE);
mediaRequest();
return;
}
sLogger.d("isrequest------>" + isRequest);
File[] musFiles = musDirFile.listFiles();
File[] imageFiles = imageDirFile.listFiles();
if (musFiles.length > 0 && imageFiles.length > 0) {
for (File file : musFiles) {
if (file.exists()) {
// Uri u = Uri.fromFile(file.getAbsoluteFile());
// mPlayer =
// MediaPlayer.create(MeetingStartActivity.this, u);
try {
musicName.setText(sp.getString("name", "123.mp3"));
mPlayer.setDataSource(file.getAbsolutePath());
mPlayer.prepare(); play.setBackgroundResource(R.drawable.paused);
isPlaying = true;
} catch (Exception e) {
e.printStackTrace();
}
// 设置进度条
seekBar1.setMax(mPlayer.getDuration());
// 定时器记录播放进度
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (isChanging) {
return;
}
seekBar1.setProgress(mPlayer.getCurrentPosition());
}
};
timer.schedule(timerTask, 0, 10);
mPlayer.start();
}
}
File firstfile = imageFiles[0];
Bitmap bitmap2 = BitmapFactory.decodeFile(firstfile
.getAbsolutePath());
ImageView firstImage = new ImageView(
MeetingStartActivity.this);
Drawable drawable2 = new BitmapDrawable(bitmap2);
firstImage.setBackground(drawable2);
for (File file : imageFiles) {
if (file.exists()) {
try {
FileInputStream is = new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = new ImageView(
MeetingStartActivity.this);
Drawable drawable = new BitmapDrawable(bitmap);
imageView.setBackground(drawable);
pageViews.add(imageView);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
pageViews.add(firstImage);
Message msg = Message.obtain();
msg.what = CACHEFILE;
handler.sendMessage(msg);
} else {
try {
String mediaurl = sp.getString("media", null);
JSONArray array = new JSONArray(mediaurl);
int length = array.length();
for (int i = 0; i < length; i++) {
ImageMusicInfo item = ImageMusicInfo
.getFromJSON((JSONObject) array.get(i));
if (item.imageUrl != null) {
mediaUrls.add(item.imageUrl);
}
}
loadeMedia();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}
// 异步请求数据
private void mediaRequest() {
if (mRegisterTask != null) {
sLogger.d("mRegisterTask still running ");
return;
}
findViewById(R.id.loading).setVisibility(View.VISIBLE);
mRegisterTask = new ImageMusicTask();
String requestURL = URLHandler.getReqeust(URLHandler.URL_IMAGE,
"meetingid", AppConfig.APP_ID);
sLogger.i("requestURL:======>" + requestURL);
mRegisterTask.execute(requestURL);
}
private class ImageMusicTask extends HttpGetTask {
private ImageMusicInfo item;
@Override
protected void onPostExecute(String result) {
mRegisterTask = null;
// findViewById(R.id.include_layout_loading).setVisibility(
// View.GONE );
sLogger.i("ImageMusicTask:------>" + result);
try {
if (result != null) {
if ("[]".equals(result) || "".equals(result)) {
Toast.makeText(MeetingStartActivity.this, "未找到资源", 0)
.show();
findViewById(R.id.loading).setVisibility(View.GONE);
return;
}
/*
*将第一次请求的数据保存到sp中,用于判断服务端是否更新了数据,若没有直接读缓存,否则根据最新的音乐和图片url下载文件并删除原来的文件
*/
if (sp == null) {
sp = getSharedPreferences("mediaurl", MODE_PRIVATE);
} else {
String oldResult = sp.getString("media", null);
if (oldResult !=null && oldResult.equals(result)) {
// 相等读缓存,不等删除原文件并下载数据
isRequest = false;
sLogger.w("isRequest========>" + isRequest);
readCacheFile();
return;
}
}
Editor edit = sp.edit();
edit.putString("media", result);
edit.commit();
sLogger.e("sp------>" + sp.getString("media", null));
JSONArray array = new JSONArray(result);
int length = array.length();
for (int i = 0; i < length; i++) {
item = ImageMusicInfo.getFromJSON((JSONObject) array
.get(i));
if (item.imageUrl != null) {
mediaUrls.add(item.imageUrl);
}
if(item.name != null){//保存音乐文件名称
Editor edit2 = sp.edit();
edit2.putString("name", item.name);
edit2.commit();
}
}
// 获取音乐图片url成功发送handler下载数据
Message msg = Message.obtain();
msg.what = SUCCESS_GET_URL;
handler.sendMessage(msg);
} else {
Toast.makeText(MeetingStartActivity.this, "未找到资源", 0)
.show();
findViewById(R.id.loading).setVisibility(View.GONE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 下载音乐,图片
*
* @param path
*/
protected void loadeMedia() {
new Thread() {
private File dir;
private InputStream is = null;
private FileOutputStream fos = null;
public void run() {
try {
deleteCachFile();
if (mediaUrls != null && mediaUrls.size() > 0) {
for (int i = 0; i < mediaUrls.size(); i++) {
String path = mediaUrls.get(i);
int index = path.lastIndexOf(".");
String str = path.substring(index + 1,
path.length());
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(path);
client.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT,
5000);
client.getParams().setParameter(
CoreConnectionPNames.SO_TIMEOUT, 10000);
HttpResponse response = client.execute(httpGet);
int statusCode = response.getStatusLine()
.getStatusCode();
if (statusCode == 200) {
is = response.getEntity().getContent();
if (Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)) {// 判断SD卡是否安装
String filePath = "/sdcard/";
String fileName = "meeting"
+ AppConfig.APP_ID;
File file2 = new File(filePath + fileName);
if (!file2.exists()) {
file2.mkdir();
}
String musicFile = filePath + fileName
+ "/music";
File file3 = new File(musicFile);
if (!file3.exists()) {
file3.mkdir();
}
String picFile = filePath + fileName
+ "/image";
File file4 = new File(picFile);
if (!file4.exists()) {
file4.mkdir();
}
// save file
int fileIndex = path.lastIndexOf("/");
String name = path.substring(fileIndex + 1,
path.length());
if (isImage(str)) {
dir = new File(file4, name);
}
if (isAuto(str)) {
dir = new File(file3, name);
}
fos = new FileOutputStream(dir);
byte[] by = new byte[1024];
int len = 0;
while ((len = is.read(by)) != -1) {
fos.write(by, 0, len);
}
}
}
}
// 文件下载完成发送handler读取缓存
Message msg = Message.obtain();
msg.what = LOADMEDIA;
handler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}.start();
}
/**
* 删除缓存文件
*/
protected void deleteCachFile() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
String musicDir = "/sdcard/meeting" + AppConfig.APP_ID + "/music/";
String imageDir = "/sdcard/meeting" + AppConfig.APP_ID + "/image/";
File musicFile = new File(musicDir);
File imageFile = new File(imageDir);
if (musicFile.exists()) {
File[] listMusic = musicFile.listFiles();
if (listMusic != null && listMusic.length > 0) {
for (File file : listMusic) {
if (file.isFile() && file.exists()) {
file.delete();
}
}
}
File[] listImage = imageFile.listFiles();
if (listImage != null && listImage.length > 0) {
for (File file : listImage) {
if (file.isFile() && file.exists()) {
file.delete();
}
}
}
}
}
}
/**
* 判断图片类型
*
* @param type
* 文件后缀名
* @return
*/
public boolean isImage(String type) {
if (type != null
&& (type.equals("jpg") || type.equals("gif")
|| type.equals("png") || type.equals("jpeg")
|| type.equals("bmp") || type.equals("wbmp")
|| type.equals("ico") || type.equals("jpe"))) {
return true;
}
return false;
}
/**
* 判断音乐类型
*
* @param type文件后缀名
* @return
*/
public boolean isAuto(String type) {
if (type != null
&& (type.equals("mp3") || type.equals("wav")
|| type.equals("rm") || type.equals("swf")
|| type.equals("wma") || type.equals("asf"))) {
return true;
}
return false;
}
@Override
protected void onStop() {
exec.shutdown();
isChanging = true;
super.onStop();
}
//按home键保存音乐的状态
@Override
protected void onResume() {
if (mPlayer != null) {
if (!mPlayer.isPlaying()) {
seekBar1.setProgress(mPlayer.getCurrentPosition());
play.setBackgroundResource(R.drawable.paused);
mPlayer.start();
}
}
super.onResume();
}
@Override
protected void onPause() {
if (mPlayer != null) {
if (mPlayer.isPlaying()) {
mPlayer.pause();
play.setBackgroundResource(R.drawable.player);
}
}
super.onPause();
}
protected void onDestroy() {
isRequest = true;
if (mPlayer != null) {
if (mPlayer.isPlaying()) {
mPlayer.stop();
}
mPlayer.release();
}
sLogger.e("isrequest---->" + isRequest + "isChanging---->" + isChanging);
super.onDestroy();
}
java类ImageMusicInfo:
public class ImageMusicInfo {
public String id;
public String meetingid;
public String imageUrl;
public String name;
public static ImageMusicInfo getFromJSON(JSONObject object) {
ImageMusicInfo result = new ImageMusicInfo();
try {
if (object.has("id"))
result.id = object.getString("id");
if (object.has("meetingid"))
result.meetingid = object.getString("meetingid");
if(object.has("pic")){
String picUrl = object.optString("pic");
// String type = object.optString("type");
if(picUrl != null){
// if("1".equals(type)){
result.imageUrl = picUrl;
// }else if("2".equals(type)){
// result.musicUrl=picUrl;
// }
}
}
if(object.has("name") && object.has("type")){
String name = object.optString("name");
String type = object.optString("type");
if("2".equals(type)){
result.name = name;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
}
垂直的ViewPager下载地址:文件名是minimal.zip
http://c38.yunpan.360.cn/my/index/#%2F%E6%96%87%E6%A1%A3%2F%E6%96%87%E4%BB%B6%2F