Android平台摇摇切歌功能

前些天印尼客户要求在高通平台7251上加一个摇摇切歌功能。查了些资料,基本实现了此功能。

直接上源码,用svn查看修改点。

前面两个ic_mp_shake_off_btn是两张图片,资源随便让UI做两张即可。

接下来就是audio_player.xml文件的修改:(这个就是你要将你的图标按钮放在哪个地方)

对应的修改其他分辨率的布局文件audio_player.xml

接下来添加对应的字串:String.xml

<span style="font-size:24px;">    <string name="shake_on_notif">摇一摇换歌功能已开启.</string>
    <string name="shake_off_notif">摇一摇换歌功能已关闭.</string></span>

各国语言的翻译也自己去添加.

接下来修改音乐播放的主类:MediaPlaybackActivity.java

首先要添加变量:private ImageButton mShakeButton;

接下来再通过findViewById来实例化摇摇按钮并添加监听;

<pre name="code" class="java"><span style="font-size:24px;">    mShakeButton = ((ImageButton) findViewById(R.id.shake));
    mShakeButton.setOnClickListener(mShakeListener); </span>

在函数onConfigurationChanged也做同样的操作;

<span style="font-size:24px;">    mShakeButton = ((ImageButton) findViewById(R.id.shake));
    mShakeButton.setOnClickListener(mShakeListener); </span>

现在就来实现监听的函数;

<span style="font-size:24px;">    <span style="font-size:18px;">private View.OnClickListener mShakeListener = new View.OnClickListener() {
        public void onClick(View v) {
            shakeEnable();
        }
    };</span></span>

写shakeEnable()函数的函数体;

<span style="font-size:24px;">    <span style="font-size:18px;">private void shakeEnable(){
	if (mService == null) {
		return;
	}
	try {
	if (mService.getShakeFlag()== false){
		mService.setShakeFlag(true);
		showToast(R.string.shake_on_notif);
	}
	else{
		mService.setShakeFlag(false);
		showToast(R.string.shake_off_notif);
	}
	setShakeButtonImage();
	}catch (RemoteException ex) {
        }

    }</span></span>

在ServiceConnection里修改按钮的可操作和设置图片;

写setShakeButtonImage 函数:

<span style="font-size:24px;">   <span style="font-size:18px;">private void setShakeButtonImage() {
        if (mService == null) return;
          try {
		if  (mService.getShakeFlag() == false) {
			mShakeButton.setImageResource(R.drawable.ic_mp_shake_off_btn);
		}else{
			mShakeButton.setImageResource(R.drawable.ic_mp_shake_on_btn);
		}
	   }catch (RemoteException ex) {
        }
    }</span></span>

MediaPlaybackActivity.java这个文件修改好了;

接下来看看MediaPlaybackService.java

先import  onShakeListener

<span style="font-size:24px;">import com.android.music.ShakeDetector.onShakeListener;</span>

申明变量:

private boolean mShakeFlag = false;

ShakeDetector mShakeDetector = null;

在onCreate()中从sharedpreference中读取值,来设置是否打开摇摇功能;

<span style="font-size:24px;">  <span style="font-size:18px;">mShakeFlag = mPreferences.getBoolean("shakeflag", false);
  setShakeOnorOff();</span></span>

在onDestroy()中取消注册:

<span style="font-size:24px;">   <span style="font-size:18px;">if (mShakeDetector != null) {
	mShakeDetector.unRegisterListener();
   }</span></span>

实现函数:

<span style="font-size:24px;">   <span style="font-size:18px;"> private void setShakeOnorOff(){
 		if (mShakeFlag == true){
 		        mShakeDetector= new ShakeDetector(this);
 			mShakeDetector.registerListener();
 			mShakeDetector.setOnShakeListener(new onShakeListener() {
 				@Override
 				public void onShake() {
 					// TODO Auto-generated method stub
 					if (isPlaying()){
 					     gotoNext(true);
 					}
 				}
 			});
 		}else{
			if (mShakeDetector != null) {
				mShakeDetector.unRegisterListener();
			}
 		}
		Editor ed = mPreferences.edit();
		ed.putBoolean("shakeflag", mShakeFlag);
		SharedPreferencesCompat.apply(ed);
 	}

    public void setShakeFlag(boolean shakeflag) {
        synchronized (this) {
            mShakeFlag = shakeflag;
            setShakeOnorOff();
        }
    }

    public boolean getShakeFlag() {
        return mShakeFlag;
    }</span></span>

在IMediaPlaybackService.Stub中设置是否打开摇摇功能

<span style="font-size:24px;">      <span style="font-size:18px;">public void setShakeFlag(boolean shakeflag) {
	    mService.get().setShakeFlag(shakeflag);
        }

        public boolean getShakeFlag() {
            return mService.get().getShakeFlag();
        }</span></span>

接下来就是在IMediaPlaybackService.aidl文件中添加对应的函数;

<span style="font-size:24px;">   <span style="font-size:18px;">void setShakeFlag(boolean shakeflag);
    boolean getShakeFlag();</span></span>

最后就是添加一个文件ShakeDetector.java

<span style="font-size:18px;">package com.android.music;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

public class ShakeDetector implements SensorEventListener {
	private static final String TAG = "ShakeDetector";
	private Context mContext;
	private long lastTime;
        private float last_x;
	private float last_y;
	private float last_z;
	private static final double SHAKE_SHRESHOLD = 3000d;//这个值可根据sensor的灵敏度来调整
        private Sensor sensor;
	private SensorManager sensorManager;
	public onShakeListener shakeListener;

	public ShakeDetector(Context context) {
		mContext = context;
		sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
	}

	public boolean registerListener() {

		if (sensorManager != null) {
			sensor = sensorManager
					.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
			if (sensor != null) {
				this.sensorManager.registerListener(this, sensor,
						SensorManager.SENSOR_DELAY_GAME);
				return true;
			}
		}
		return false;
	}

	public void unRegisterListener() {
	System.out.println("ShakeDetector:unRegisterListener");
		if (sensorManager != null  && sensor != null)
			sensorManager.unregisterListener(this , sensor);
	}

	public void setOnShakeListener(onShakeListener listener) {
		shakeListener = listener;
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		// TODO Auto-generated method stub

			long curTime = java.lang.System.currentTimeMillis();
			if ((curTime - lastTime) > 50) {
				long diffTime = (curTime - lastTime);
				lastTime = curTime;
				float x = event.values[0];
				float y = event.values[1];
				float z = event.values[2];
                                float speed = Math.abs(x + y + z - last_x - last_y - last_z)
						/ diffTime * 10000;
				System.out.println("ShakeDetector:onSensorChanged speed ="+speed);
				if (speed > SHAKE_SHRESHOLD) {
					shakeListener.onShake();
				}
				last_x = x;
				last_y = y;
				last_z = z;
			}

	}

       public interface onShakeListener {
		public void onShake();
	}
}</span>

好,到此为止,就可以实现摇摇切歌功能了,如果有用得上的,可以拿去用一下,别的平台(展讯,MTK)也都可以类似的实现此功能,有问题请在后面留言。

时间: 2024-11-13 08:01:17

Android平台摇摇切歌功能的相关文章

(转)android平台下使用点九PNG技术

“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形. 我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真. OK,在android平台下使用点九PNG技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果. [

Android平台,利用zxing库开发扫码功能

Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发. 1.如何将zxing的Android源码导入工程. 在导入zxing的android源码之前,先去官方下载zxing的源码:http://code.google.com/p/zxin

iOS 混合应用的关键点分析 - 仿 Android 平台 WebView 可注入本地对象方法的功能实现要点

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 对于 iOS 和 Android 平台来说,各自的流畅览器组件 UIWebView 和 WebView 都可以很容易地在本地代码中调用 WebVi

Android平台介绍

一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操作系统 Android.IOS.Windows Phone.BlackBerry.Symbian 什么是Android Android是一种基于Linux的开源操作系统,主要使用于移动设备,例如智能手机.平板电脑.智能手表.智能电视等等.由Google公司和开放手机联盟领导及开发.Android操作

Android平台jieahoa

一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操作系统 Android.IOS.Windows Phone.BlackBerry.Symbian 什么是Android Android是一种基于Linux的开源操作系统,主要使用于移动设备,例如智能手机.平板电脑.智能手表.智能电视等等.由Google公司和开放手机联盟领导及开发.Android操作

Android平台上裁剪m4a

Android手机上设置铃声的操作是比较灵活的,一般读者听到一首喜欢的歌曲,马上就可以对这首歌曲进行裁剪,裁剪到片段后,再通过系统的接口设置为铃声(电话铃声.闹钟铃声等). 前提是,播放这首歌的APP,需要提供裁剪歌曲的功能. 那么,怎么样实现截取音频文件的一个片段的功能呢? 小程很自然就想到使用FFmpeg命令来实现,之前介绍"从视频中提取图片"的内容就可以提取片段,比如: ffmpeg -ss 10 -i audio.mp3 -t 5 out.mp3上面的命令,从第10秒开始,提取

基于Android平台的i-jetty网站智能农业监控系统

基于android平台i-jetty网站的智能农业监控系统 摘要:传统的监控系统,一般是基于PC的有线通信传输,其有很多不足之处,如功耗较高.布线成本高.难度大,适应性差,可扩展性不强,增加新的通信线路需要再次布线施工,而且维护起来也比较麻烦,一旦线路出问题,需要繁琐的检查.而嵌入式Web监控系统是基于物联网技术,其无线通信技术具有成本低廉.适应性强.扩展性强.信息安全.使用维护简单等优点. 智能农业中,种植大棚是通过大棚内安装温湿度以及光照传感器,来对农作物的环境参数进行实时采集,由Web监控

Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题

做一个需要嵌入式数据库Sqlite 的unity3d项目,在pc机上运行良好,需要发布到Android平台上,于是,各种坑爹...会遇到找不到数据库文件的问题.当在pc机上使用sqlite时,当执行SqliteConnection dbConnection = new SqliteConnection("data source = test.db");语句时,如果有这个数据库文件则建立连接,如果没有则创建出这个文件,然后建立连接.当在Android平台上时,扯淡的事情就开始了,总之便不

调研Android平台的开发环境的发展演变

一.发展演变 1.Android版本进化史 阿童木(Android beta)和发条机器人(Android1.0)->Cupcake(Android1.5)->Dount(Android1.6)->Eclair(Android2.0/2.1)->Froyo(Android2.2/2.2.1)->Gingerbread(Android2.3.x)->Honeycomb(Android3.0/3.1/3.2)->Ice Cream Sandwich(Android4.