asdzheng的专栏

从微信使用摇一摇功能开始,大家就一直喜欢这个简单又刺激的功能,无数个单身男女只要摇摇手中的机子,,说不定就能找到终身或一晚的伴侣,这是多奇妙的事呀。

不过摇一摇可不止可以用来搜索同时摇晃手机的人,你还能摇一摇转帐打电话发短信,只要想要。

那摇一摇这个功能是怎么实现的呢?

下面就来看看我用摇一摇实现给默认联系人发送短信,其实只要判断手机晃动速度达到一定的程度就会触发相应的事件,然后作操作就可以拉。

import java.util.ArrayList;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;/** * 这这个是检测摇一摇的类 * @author asdzheng */{DEFAULT_THRESHOLD_ACCELERATION = 15;INTERVAL = 400;private static SensorManager mSensorManager;private static ShakeSensorManager mSensorEventListener;private OnShakeListener mShakeListener;private Object mLock;private float mThresholdAcceleration;private ArrayList<SensorBundle> mSensorBundles;{/*** 当检测到摇一摇时调用此方法*/();}(Context context, OnShakeListener listener) {if (context == null) {throw new IllegalArgumentException(“Context must not be null”);}if (mSensorManager == null) {mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);}mSensorEventListener = new ShakeSensorManager(listener);return true;}(OnShakeListener listener) {if (listener == null) {throw new IllegalArgumentException(“Shake listener must not be null”);}mSensorBundles = new ArrayList<SensorBundle>();mShakeListener = listener;mLock = new Object();mThresholdAcceleration = DEFAULT_THRESHOLD_ACCELERATION;}() {if (mSensorManager != null && mSensorEventListener != null) {return .registerListener(mSensorEventListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST);}return false;}() {if (mSensorManager != null) {mSensorManager.unregisterListener(mSensorEventListener);}}/*** 释放所有之前用到的类*/() {mSensorManager = null;mSensorEventListener = null;}(int sensibility) {mThresholdAcceleration = sensibility;}(SensorEvent sensorEvent) {SensorBundle sensorBundle = new SensorBundle(sensorEvent.values[0],sensorEvent.values[1],sensorEvent.values[2],sensorEvent.timestamp);synchronized (mLock) {if (mSensorBundles.size() == 0) {mSensorBundles.add(sensorBundle);} else if (sensorBundle.getTimestamp()- mSensorBundles.get(mSensorBundles.size() – 1).getTimestamp() > INTERVAL) {//这个判断是防止摇晃手机时多次调用此方法performCheck(sensorBundle);}}}(Sensor sensor, int i) {//这个方法是当换掉感应器时才会触发,基本不会调用}(SensorBundle sensorBundle) {synchronized (mLock) {if (Math.abs(sensorBundle.getXAcc()) > mThresholdAcceleration|| Math.abs(sensorBundle.getYAcc()) > mThresholdAcceleration|| Math.abs(sensorBundle.getZAcc()) > mThresholdAcceleration) {mShakeListener.OnShake();}}}{/*** The acceleration on X axis.*/mXAcc;/*** The acceleration on Y axis.*/mYAcc;/*** The acceleration on Z axis.*/mZAcc;/*** The timestamp when to record was captured.*/mTimestamp;public SensorBundle(float XAcc, float YAcc, float ZAcc, long timestamp) {mXAcc = XAcc;mYAcc = YAcc;mZAcc = ZAcc;mTimestamp = timestamp;}() {return mXAcc;}() {return mYAcc;}() {return mZAcc;}() {return mTimestamp;}}}

下面这个类是主页面,也是唯一页面,先来看它的截图。

下面再来看主页面的代码:

import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.os.Bundle;import android.provider.ContactsContract;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import com.example.db.ShakeSqliteHelper;/** * asdzheng 这是界面 */{private String telnum = “”;private SQLiteDatabase dbWriter;// 获得数据库可写操作的对象private SQLiteDatabase dbReader;private ShakeSqliteHelper mySqlite;// 声明继承自SQLiteOpenHelper类的MySqkliteprivate ImageView iv_head;private TextView tv_name;private TextView tv_num;private Button btn_pick;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mySqlite = new ShakeSqliteHelper(this);// 实例化MySqklite对象dbWriter = mySqlite.getWritableDatabase();// 获得数据库可写操作权限dbReader = mySqlite.getReadableDatabase();initView();//检测到摇一摇是在服务里,这样即使退出这个界面,依旧可以检测到摇一摇startService(new Intent(this, ShakeService.class));}() {iv_head = (ImageView) findViewById(R.id.iv_head);tv_name = (TextView) findViewById(R.id.tv_name);tv_num = (TextView) findViewById(R.id.tv_telnum);btn_pick = (Button) findViewById(R.id.btn_pick);btn_pick.setOnClickListener(new OnClickListener() {(View v) {Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);startActivityForResult(intent, 1);}});getUserInfoFromDB();}() {String name = “”;String imagePath = “”;// 游标存储数据Cursor cursor = dbReader.query(ShakeSqliteHelper.USER_TABLE, null,null, null, null, null, null);while (cursor.moveToNext()) {// 判断游标的移动telnum = cursor.getString(cursor.getColumnIndex(ShakeSqliteHelper.COLUMN_NUM));name = cursor.getString(cursor.getColumnIndex(ShakeSqliteHelper.COLUMN_NAME));imagePath = cursor.getString(cursor.getColumnIndex(ShakeSqliteHelper.COLUMN_PATH));}setUserInfo(name, imagePath);}(String name, String imagePath) {tv_name.setText(name);tv_num.setText(telnum);if (imagePath == null || imagePath.isEmpty()) {iv_head.setImageResource(R.drawable.ic_launcher);} else {iv_head.setImageURI(Uri.parse(imagePath));}}(int requestCode, int resultCode, Intent data) {if (requestCode == 1 && resultCode == Activity.RESULT_OK) {Uri contactData = data.getData();Cursor cursor = getContentResolver().query(contactData, null, null,null, null);if (cursor.moveToFirst()) {String id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));if (hasPhone.equalsIgnoreCase(“1″)) {Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ ” = ” + id,null, null);phones.moveToFirst();telnum = phones.getString(phones.getColumnIndex(“data1”));}String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));String imagePath = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));setUserInfo(name, imagePath);addUserToDB(name, imagePath);}}}(String name, String imagePath) {String[] args = { “1”, name, telnum, imagePath == null ? “” : imagePath };dbWriter.execSQL(“INSERT OR REPLACE INTO “+ ShakeSqliteHelper.USER_TABLE + ” (“+ ShakeSqliteHelper.COLUNN_ID + “,”+ ShakeSqliteHelper.COLUMN_NAME + “, “+ ShakeSqliteHelper.COLUMN_NUM + “,”+ ShakeSqliteHelper.COLUMN_PATH + “) VALUES (?, ?, ?, ?)”, args);}}请打开窗口,让我的灵魂与你的灵魂相拥。

asdzheng的专栏

相关文章:

你感兴趣的文章:

标签云: