`
whuthj
  • 浏览: 72523 次
  • 性别: 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程序的大...

    qtav widget的简单实用

    至此,一个简单的QtAV Widget播放器已经实现。用户可以通过“打开”菜单项选择视频文件,程序会自动开始播放。你可以根据需要扩展功能,例如添加控制条、支持更多格式、调整播放设置等。 在实际应用中,可能还需要...

    安卓优雅音乐播放器widget

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

    仿小米音乐播放器带widget

    优雅音乐播放器是一款精心设计的音乐应用,其特色在于它带有Widget功能,模仿了MIUI系统中的音乐播放器界面,提供了美观且用户友好的体验。Widget在安卓系统中是一种小型的应用程序视图,可以直接在主屏幕上显示,让...

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

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

    Android App Widget 开发

    在本示例中,我们将探讨如何开发一个简单的音乐播放器App Widget。 首先,创建一个新的Android项目,并在`res/xml`目录下创建一个名为`app_widget_info.xml`的配置文件。这个文件定义了App Widget的基本属性,如...

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

    在Android平台上,开发一款桌面音乐播放器Widget是一个有趣且实用的实践项目。本文将深入解析如何利用Android的App Widget API创建一个能够在用户桌面运行并控制音乐播放的应用组件。通过源码分析,我们可以学习到...

    Widget桌面

    "Widget桌面"是一款基于Widget技术开发的桌面插件应用。Widget技术在Android系统中被广泛应用,它允许开发者创建小型、可自定义的UI组件,这些组件可以直接显示在用户的主屏幕上,提供快速访问或操作的功能。这个...

    什么是Widget

    例如,音乐播放器Widget可以用来控制音乐播放,天气Widget可以实时显示当地天气预报。iOS也支持Widget,但其设计和交互方式与Android略有不同,通常通过“今日”视图来访问。 **Widget的开发与实现** 开发Widget...

    Web+widget资料.rar

    例如,音乐播放器Widget可以让用户直接在主屏幕控制音乐播放,天气Widget可以实时显示天气状况。 在Web+Widget的组合中,Web技术提供了一个灵活的平台,允许开发者构建复杂的交互式应用,而Widget则起到了模块化和...

    android widget实例下载

    - **音乐播放器**:控制音乐播放、暂停、切换歌曲等功能。 - **新闻概览**:显示最新新闻标题,点击跳转到详细文章。 通过研究这个"android widget实例下载",开发者不仅可以学习如何创建基本的小部件,还可以...

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

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

    Android高级应用源码-android Widget小组件开发.rar

    Widget可以显示静态信息,如天气预报,也可以动态更新,如音乐播放器控制。 二、Widget的组成 1. AppWidgetProvider:这是Widget的核心类,继承自BroadcastReceiver,负责处理用户的点击事件和其他BroadcastIntent...

    widget示例代码

    本示例代码主要探讨的是如何创建一个音乐播放器的Widget。 在Android开发中,创建一个Widget首先需要在`AndroidManifest.xml`文件中声明一个新的`&lt;receiver&gt;`标签,指定其为`AppWidgetProvider`类型,并赋予唯一的...

    appwidget的简单使用

    **AppWidget的简单使用** AppWidget是Android系统提供的一种组件,允许开发者在用户的主屏幕上创建小型、可交互的应用程序小部件。这些小部件无需用户直接启动应用,就能展示实时信息或者提供快速操作入口,极大地...

    Widget2Home

    在Android系统中,小部件是一种可以直接在桌面显示并交互的功能组件,它们可以是天气预报、日历、音乐播放器控制等,提供快速访问和操作各种功能的方式。下面我们将详细探讨如何在Android平台上创建和使用Widget,...

    Android_自定義Widget

    Widget是Android系统中的一种组件,它们通常用于Home屏幕,如时钟、天气预报或音乐播放器控制等。自定义Widget则允许开发者超越预定义组件的限制,创建具有特定功能和设计的UI元素。 1. **创建布局资源**:自定义...

    Widget营销案例.pptx

    Widget 的灵感来自于一次对播放器的换肤,但最初无人看好。1998-2001 年,Rose 与 Perry 一拍即合,终于,在 2003 年 Widget 诞生了!2002-2003 年,Widget 的名称被正式启用,它在苹果操作系统中所表现出的热潮使得...

    基于Qt设计的音乐播放器

    在Qt中,`QWidget`是所有用户界面组件的基础,这里可能是自定义了一个`Widget`类,用于构建音乐播放器的UI,如播放/暂停按钮、音量控制、进度条、歌曲列表等。`widget.ui`是使用Qt Designer创建的用户界面的XML描述...

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

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

Global site tag (gtag.js) - Google Analytics