`
whuthj
  • 浏览: 70242 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

widget播放器

阅读更多

首先我们要向SD卡中添加音频文件。步骤如下:启动模拟器,在Eclipses上选择DDMS窗口,选择File Explorer标签。如下图:

向左、向右箭头分别是拷出、拷进制定位置。

然后我们就开始新建一个项目WidgetMusicPlay

编写WidegetMusicPlay.java,代码如下:

package com.croft.demo;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;

public class WidgetMusicPlay extends ListActivity implements OnClickListener {
 /* 几个操作按钮 */
 private ImageButton LastImageButton = null;
 private ImageButton StopImageButton = null;
 private ImageButton StartImageButton = null;
 private ImageButton PauseImageButton = null;
 private ImageButton NextImageButton = null;

 private Intent musicIntent;
 /* 播放列表 */
 private List<String> mMusicList = new ArrayList<String>();

 /* 音乐的路径 */
 private static final String MUSIC_PATH = new String("/sdcard/");

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  /* 更新显示播放列表 */
  musicList();
  // 新创建一个Intent,把启动的服务加到Intent中
  musicIntent = new Intent("com.croft.demo.START_AUDIO_SERVICE");
  LastImageButton = (ImageButton) findViewById(R.id.LastImageButton);
  StopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
  StartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
  PauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
  NextImageButton = (ImageButton) findViewById(R.id.NextImageButton);
  // 给各个按钮添加事件监听器,监听器由本类来实现OnClickListener接口
  myButtonSetListener();
 }

 private void myButtonSetListener() {
  LastImageButton.setOnClickListener(this);
  StopImageButton.setOnClickListener(this);
  StartImageButton.setOnClickListener(this);
  PauseImageButton.setOnClickListener(this);
  NextImageButton.setOnClickListener(this);
 }

 @Override
 public void onClick(View button) {
  // TODO Auto-generated method stub
  // 根据button.getId()获取View的ID来判断事件是由那个按钮来发出的,然后进行相应的事件处理
  switch (button.getId()) {
  case R.id.StartImageButton: {
   musicIntent.setFlags(R.id.StartImageButton);
   // 启动音乐播放服务
   this.startService(musicIntent);
  }
   break;
  case R.id.StopImageButton: {
   // 停止音乐播放服务
   this.stopService(musicIntent);
  }
   break;
  case R.id.LastImageButton: {
   musicIntent.setFlags(R.id.LastImageButton);
   // 启动音乐播放服务
   this.startService(musicIntent);
  }
   break;
  case R.id.NextImageButton: {
   musicIntent.setFlags(R.id.NextImageButton);
   // 启动音乐播放服务
   this.startService(musicIntent);
  }
   break;
  case R.id.PauseImageButton: {
   musicIntent.setFlags(R.id.PauseImageButton);
   // 启动音乐播放服务
   this.startService(musicIntent);
  }
   break;
  default:
   break;
  }
 }

 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   // 停止音乐播放服务
   this.stopService(musicIntent);
   this.finish();
   return true;
  }
  return super.onKeyDown(keyCode, event);
 }

 @Override
 /* 当我们点击列表时,播放被点击的音乐 */
 protected void onListItemClick(ListView l, View v, int position, long id) {
  musicIntent.setFlags(position);
  this.startService(musicIntent);
 }

 /* 播放列表 */
 public void musicList() {
  // 取得指定位置的文件设置显示到播放列表
  File home = new File(MUSIC_PATH);
  if (home.listFiles(new MusicFilter()).length > 0) {
   for (File file : home.listFiles(new MusicFilter())) {
    mMusicList.add(file.getName());
   }
   ArrayAdapter<String> musicList = new ArrayAdapter<String>(
     WidgetMusicPlay.this, R.layout.musicitme, mMusicList);
   setListAdapter(musicList);
  }
 }

 /* 过滤文件类型 */
 class MusicFilter implements FilenameFilter {
  public boolean accept(File dir, String name) {
   // 这里还可以设置其他格式的音乐文件
   return (name.endsWith(".mp3"));
  }
 }

}

写完了Activity后我们还要些个最关键的Service,播放器的播放功能都在这里面。

MusicService.java

package com.croft.demo;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;

public class MusicService extends Service {
 // 声明一个MediaPlayer实例对象
 public MediaPlayer myMusicPlayer = new MediaPlayer();
 /* 当前播放歌曲的索引 */
 private int currentListItme = 0;
 /* 播放列表 */
 private List<String> mMusicList = new ArrayList<String>();

 /* 音乐的路径 */
 private static final String MUSIC_PATH = new String("/sdcard/");

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }

 // 服务启动方法
 @Override
 public void onStart(Intent intent, int startId) {
  // TODO Auto-generated method stub
  super.onStart(intent, startId);
  // 取得指定位置的文件设置显示到播放列表
  musicList();
  int flag = intent.getFlags();
  switch (flag) {
  case R.id.StartImageButton: {
   playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
  }
   break;
  case R.id.LastImageButton: {
   FrontMusic();
  }
   break;
  case R.id.NextImageButton: {
   nextMusic();
  }
   break;
  case R.id.PauseImageButton: {
   PauseMusic();
  }
   break;
  default:
   playMusic(MUSIC_PATH + mMusicList.get(flag));
   break;
  }

 }

 // 服务销毁方法
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  // 停止音乐播放
  myMusicPlayer.stop();
  myMusicPlayer.release();
 }

 /* 下一首 */
 private void nextMusic() {
  if (++currentListItme >= mMusicList.size()) {
   currentListItme = 0;
   playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
  } else {
   playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
  }
 }

 /* 上一首 */
 private void FrontMusic() {
  if (--currentListItme < 0) {
   currentListItme = mMusicList.size() - 1;
   playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
  } else {
   playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
  }
 }

 private void PauseMusic() {
  if (myMusicPlayer.isPlaying()) {
   /* 暂停 */
   myMusicPlayer.pause();
  } else {
   /* 开始播放 */
   myMusicPlayer.start();
  }
 }

 public void playMusic(String path) {
  try {
   /* 重置MediaPlayer */
   myMusicPlayer.reset();
   /* 设置要播放的文件的路径 */
   myMusicPlayer.setDataSource(path);
   // 准备播放器,进行回放
   myMusicPlayer.prepare();
   // 启动MediaPlayer
   myMusicPlayer.start();
   myMusicPlayer.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer arg0) {
     // 播放完成一首之后进行下一首
     nextMusic();
    }
   });
  } catch (IOException e) {

  }
 }

 /* 播放列表 */
 public void musicList() {
  // 取得指定位置的文件设置显示到播放列表
  File home = new File(MUSIC_PATH);
  if (home.listFiles(new MusicFilter()).length > 0) {
   for (File file : home.listFiles(new MusicFilter())) {
    mMusicList.add(file.getName());
   }
  }
 }

 /* 过滤文件类型 */
 class MusicFilter implements FilenameFilter {
  public boolean accept(File dir, String name) {
   // 这里还可以设置其他格式的音乐文件
   return (name.endsWith(".mp3"));
  }
 }
}

然后我们要给应用程序添加成widget的效果,在AndroidManifest.xml文件里面修改

<application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".WidgetMusicPlay" android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
  <service android:name="MusicService">
   <intent-filter>
    <action android:name="com.croft.demo.START_AUDIO_SERVICE"></action>
    <category android:name="android.intent.category.DEFAULT"></category>
   </intent-filter>
  </service>
  <receiver android:name="MusicAppWidgetProvider">
   <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
       <action android:name="com.croft.demo.START_AUDIO_CLICK"></action>
       <action android:name="com.croft.demo.STOP_AUDIO_CLICK"></action>
       <action android:name="com.croft.demo.PAUSE_AUDIO_CLICK"></action>
       <action android:name="com.croft.demo.LAST_AUDIO_CLICK"></action>
       <action android:name="com.croft.demo.NEXT_AUDIO_CLICK"></action>
   </intent-filter>
   <meta-data android:name="android.appwidget.provider"
    android:resource="@xml/example_appwidget_info">
   </meta-data>
  </receiver>
 </application>

其中<intent-filter>中的内容我们等下要在编写的MusicAppWidgetProvider文件中用到,实现widget播放功能

MusicAppWidgetProvider.java

public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  super.onReceive(context, intent);
 
  if(intent.getAction().equals("com.croft.demo.START_AUDIO_CLICK")) {
      //Toast.makeText(context, "It works", Toast.LENGTH_SHORT).show();
   musicIntent=new Intent("com.croft.demo.START_AUDIO_SERVICE");
   musicIntent.setFlags(R.id.StartImageButton);
   context.startService(musicIntent);
   }
  if(intent.getAction().equals("com.croft.demo.STOP_AUDIO_CLICK")) {
     // Toast.makeText(context, "It works", Toast.LENGTH_SHORT).show();
    musicIntent=new Intent("com.croft.demo.START_AUDIO_SERVICE");
    context.stopService(musicIntent);
    }
  if(intent.getAction().equals("com.croft.demo.LAST_AUDIO_CLICK")) {
     //  Toast.makeText(context, "It works", Toast.LENGTH_SHORT).show();
    musicIntent=new Intent("com.croft.demo.START_AUDIO_SERVICE");
    musicIntent.setFlags(R.id.LastImageButton);
    context.startService(musicIntent);
    }
  if(intent.getAction().equals("com.croft.demo.NEXT_AUDIO_CLICK")) {
     //  Toast.makeText(context, "It works", Toast.LENGTH_SHORT).show();
    musicIntent=new Intent("com.croft.demo.START_AUDIO_SERVICE");
    musicIntent.setFlags(R.id.NextImageButton);
    context.startService(musicIntent);
    }
  if(intent.getAction().equals("com.croft.demo.PAUSE_AUDIO_CLICK")) {
     //  Toast.makeText(context, "It works", Toast.LENGTH_SHORT).show();
    musicIntent=new Intent("com.croft.demo.START_AUDIO_SERVICE");
    musicIntent.setFlags(R.id.PauseImageButton);
    context.startService(musicIntent);
    }
 }

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  // TODO Auto-generated method stub
  // 修改。。
  super.onUpdate(context, appWidgetManager, appWidgetIds);
 
  //开始播放
   musicIntent = new Intent("com.croft.demo.START_AUDIO_CLICK");
  //musicIntent.setComponent(serviceName);
      pendingIntent = PendingIntent.getBroadcast(context, 0,
    musicIntent, 0);
  // 为App Widget 取得布局并且拴一个on-click 监听器到该 button 上
   views = new RemoteViews(context.getPackageName(),
    R.layout.mywidgetlayout);
  views.setOnClickPendingIntent(R.id.StartImageButton, pendingIntent);
  // 告诉 AppWidgetManager 在当前App Widget上 执行一次更新
  appWidgetManager.updateAppWidget(appWidgetIds, views);
 
  //停止播放
   musicIntent = new Intent("com.croft.demo.STOP_AUDIO_CLICK");
  //musicIntent.setComponent(serviceName);
   pendingIntent = PendingIntent.getBroadcast(context, 0,
    musicIntent, 0);
  // 为App Widget 取得布局并且拴一个on-click 监听器到该 button 上
   views = new RemoteViews(context.getPackageName(),
    R.layout.mywidgetlayout);
  views.setOnClickPendingIntent(R.id.StopImageButton, pendingIntent);
  // 告诉 AppWidgetManager 在当前App Widget上 执行一次更新
  appWidgetManager.updateAppWidget(appWidgetIds, views);
 
  //上一首
  musicIntent = new Intent("com.croft.demo.LAST_AUDIO_CLICK");
  //musicIntent.setComponent(serviceName);
   pendingIntent = PendingIntent.getBroadcast(context, 0,
    musicIntent, 0);
  // 为App Widget 取得布局并且拴一个on-click 监听器到该 button 上
   views = new RemoteViews(context.getPackageName(),
    R.layout.mywidgetlayout);
  views.setOnClickPendingIntent(R.id.LastImageButton, pendingIntent);
  // 告诉 AppWidgetManager 在当前App Widget上 执行一次更新
  appWidgetManager.updateAppWidget(appWidgetIds, views);
 
  //下一首
  musicIntent = new Intent("com.croft.demo.NEXT_AUDIO_CLICK");
  //musicIntent.setComponent(serviceName);
   pendingIntent = PendingIntent.getBroadcast(context, 0,
    musicIntent, 0);
  // 为App Widget 取得布局并且拴一个on-click 监听器到该 button 上
   views = new RemoteViews(context.getPackageName(),
    R.layout.mywidgetlayout);
  views.setOnClickPendingIntent(R.id.NextImageButton, pendingIntent);
  // 告诉 AppWidgetManager 在当前App Widget上 执行一次更新
  appWidgetManager.updateAppWidget(appWidgetIds, views);
 
  //暂停播放
  musicIntent = new Intent("com.croft.demo.PAUSE_AUDIO_CLICK");
  //musicIntent.setComponent(serviceName);
   pendingIntent = PendingIntent.getBroadcast(context, 0,
    musicIntent, 0);
  // 为App Widget 取得布局并且拴一个on-click 监听器到该 button 上
   views = new RemoteViews(context.getPackageName(),
    R.layout.mywidgetlayout);
  views.setOnClickPendingIntent(R.id.PauseImageButton, pendingIntent);
  // 告诉 AppWidgetManager 在当前App Widget上 执行一次更新
  appWidgetManager.updateAppWidget(appWidgetIds, views);
 }

 

分享到:
评论

相关推荐

    andriod的一个桌面Widget 一个MP3播放器

    这是一个MP3程序,这个程序不仅仅带Activity,还有一个桌面Widget,同时是可以运行的源代码。可以通过桌面Widget控制后台音乐的播放,也可以点击Widget上面的LOGO进入应用程序。 涉及到了,一个基本的widget程序的大...

    安卓优雅音乐播放器widget

    安卓优雅音乐播放器,带widget

    Android音乐播放器项目(含Widget小挂件、Notification通知栏)

    Android音乐播放器项目(含Widget小挂件、Notification通知栏)代码详解博客:https://blog.csdn.net/jal517486222/article/details/88994863

    仿小米音乐播放器带widget

    优雅音乐播放器带widget,界面好看,仿MIUI音乐

    《桌面widget详解(四)——桌面音乐播放器(实战)》源码

    博客《桌面widget详解(四)——桌面音乐播放器(实战)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/41754477

    Android之AppWidget(桌面小部件)开发浅析

    典型的程序有时钟、天气、音乐播放器等。AppWidget 是Android 系统应用开发层面的一部分,有着特殊用途,使用得当的化,的确会为app 增色不少,它的工作原理是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法...

    Android App Widget 开发

    Android App Widget 开发,demo实现了一个简单的音乐播放器,详见http://blog.csdn.net/huaxun66/article/details/77880376

    Android 编写与酷狗音乐极像的音乐播放器源代码.rar

    Android 编写与酷狗音乐极像的音乐播放器源代码,这个播放器的名字叫做百纳音乐播放器,界面写的挺不错,功能都有,不过没有酷狗多,在本程序的编写中,获得widget界面的引用,widget只能通过RemoteView改变界面,不...

    WordPress漂亮的音乐播放器插件Aplayer

    WordPress漂亮的音乐播放器插件Aplayer

    Android Apollo音乐播放器

    Apollo音乐播放器是国外著名固件团队CM所推出的一款音乐应用,作为CM系列ROM的默认播放器,界面简洁,左右滑动可以切换不同的歌曲筛选,支持各种主题切换,支持锁屏状态下的widget,包括Android4.2,此版本首次在...

    appwidget的简单使用

    appwidget的简单使用

    Widget桌面

    该资源是我所编写的widge桌面插件,里面的代码都是比较基础的,你们可以考虑从基础的代码扩展。

    QT+FFMPEG设计的流媒体播放器(播放rtsp+rtmp流).zip

    这是QT+FFMPEG设计的流媒体播放器完整源码 1. 支持RTMP流播放 2. 支持RTSP流播放 3. 支持音频播放 4. 支持视频播放 编译器: MinGW 32位 QT版本: 5.12.6

    Qt.MP3音乐播放器

    Qt widget加qss做的一款音乐播放器,只支持本地播放,有源码。

    Android音乐播放器

    本Mini音乐播放器,能够播放mp3、wma两种格式的音频文件,实现了 基本的播放功能,其他更多功能,正在开发中。 5.注意事项:如果Widget不能即时添加,则应在启动本软件之前先添加 Widget,再启动软件,这样便可以...

    Android开发之App widget用法实例分析

    放在桌面上的控件叫做——App widget,例如可以在桌面上添加按钮、图片等等控件,例如桌面播放器的控制面板 AppWidgetProviderInfo对象,它为App Widget提供元数据,包括布局、更新频率等等数据,这个对象不是由我们...

    开发多媒体播放器

    //打开媒体播放器 Intent intent = new Intent(MyFileActivity.this, MediaPlayerActivity.class); intent.putExtra("path",path); startActivity(intent); finish(); } /** *ListView列表适配器 *...

    音乐播放器-AndroidApplication

    使用Android来实现音乐播放器,结合了AudioFocus、Android的四大组件。在实现App的同时结合了Widget。

    音乐播放器

    include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui-&gt;setupUi(this); pathName = "/home/akaedu/akplayer/music/"; // getMusicList();...

    BubbleUPnP音乐播放器

    - fixed widget visual issues - fixed super slow thumbnail generation in the local media server "Images" subfolders - fixed XBMC 13.1 not working with Audio Cast - fixed BubbleUPnP Server music caching...

Global site tag (gtag.js) - Google Analytics