基于Android重力傳感器的編程 -- 搖一搖打電話+旋轉鎖屏功能的實現

jopen 11年前發布 | 37K 次閱讀 Android Android開發 移動開發

最后的效果圖為:

20131027151248859.jpg


1、main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

     />


 <Button 
     android:id="@+id/bt_rotate"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="@drawable/rotate"
     android:text="旋轉鎖屏"
     android:onClick="goRotate"

     />

</LinearLayout></pre>

2、shake.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

<Button android:id="@+id/clear"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello_world"
    />

</LinearLayout></pre>

3、rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

android:background="@drawable/c">


<TextView 
    android:id="@+id/tv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello_world"/>

</LinearLayout></pre>

-------------------以上UI的編寫,接下來是邏輯功能的實現

4、MainActivity

package com.njupt.zzt_love_hjd;

import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.Button;

public class MainActivity extends Activity {

private Button bt_shake;
private Button bt_rotate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bt_shake = (Button) findViewById(R.id.bt_shake);
    bt_rotate = (Button) findViewById(R.id.bt_rotate);
}

public void goShake(View v){
     Intent i1 = new Intent(getApplicationContext(),ShakeActivity.class);
     startActivity(i1);

}



public void goRotate(View v){
    Intent i2 = new Intent(getApplicationContext(),RotateActivity.class);
    startActivity(i2);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}</pre>

5、ShakeActivity

package com.njupt.zzt_love_hjd;

import android.app.Activity; import android.app.Service; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast;

public class ShakeActivity extends Activity implements SensorEventListener {

private Button clear;
private SensorManager mSensorManager;
private Vibrator vibrator;
private int counter = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.shake);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
    clear = (Button) findViewById(R.id.clear);

    clear.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            clear.setText("現在給button賦值嘍....");
        }
    });

}

@Override
protected void onResume() {
    super.onResume();

    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onStop() {
    mSensorManager.unregisterListener(this);
    super.onStop();
}

@Override
protected void onPause() {
    mSensorManager.unregisterListener(this);
    super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public void onSensorChanged(SensorEvent event) {
    int sensorType = event.sensor.getType();
    float[] values = event.values;

    if(sensorType == Sensor.TYPE_ACCELEROMETER){
        if(Math.abs(values[0] )> 14 &&Math.abs(values[1] )> 14 &&Math.abs(values[2] )> 14  ){
            clear.setText("測試成功"+(counter++));
            vibrator.vibrate(500);

// Toast.makeText(this, "您晃動了手機", 1).show();

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_DIAL);

// intent.setData(Uri.parse("tel:" + number)); startActivity(intent); }

    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}</pre>

6、MyAdmin(用于鎖屏中的獲取管理員權限)

package com.njupt.zzt_love_hjd;

import android.app.admin.DeviceAdminReceiver;

public class MyAdmin extends DeviceAdminReceiver {

}</pre>

7、RotateActivity

package com.njupt.zzt_love_hjd;

import android.app.Activity; import android.app.Service; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.view.Menu; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;

public class RotateActivity extends Activity implements SensorEventListener {

private Button clear;
private TextView tv1;
private SensorManager mSensorManager;
private Vibrator vibrator;
private int counter = 1;
private DevicePolicyManager devicePolicyManager;
private boolean isAdminActive;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rotate);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
    // clear = (Button) findViewById(R.id.clear);

    // clear.setOnClickListener(new Button.OnClickListener() {
    //
    // @Override
    // public void onClick(View v) {
    // clear.setText("現在給button賦值嘍....");
    // }
    // });
    //
    tv1 = (TextView) findViewById(R.id.tv1);

    devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    // 申請權限
    ComponentName componentName = new ComponentName(this, MyAdmin.class);
    // 判斷該組件是否有系統管理員的權限
    isAdminActive = devicePolicyManager
            .isAdminActive(componentName);

    if(!isAdminActive){
        Intent intent = new Intent();
        //指定動作
        intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        //指定給那個組件授權
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        startActivity(intent);
    }

}

@Override
protected void onResume() {
    super.onResume();

    mSensorManager.registerListener(this,
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onStop() {
    mSensorManager.unregisterListener(this);
    super.onStop();
}

@Override
protected void onPause() {
    mSensorManager.unregisterListener(this);
    super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public void onSensorChanged(SensorEvent event) {
    int sensorType = event.sensor.getType();
    float[] values = event.values;

    float x = values[0];
    float y = values[1];

    if (sensorType == Sensor.TYPE_ACCELEROMETER) {
        tv1.setText("現在的x軸是: " + x + " y軸是: " + y);

        if (Math.abs(x) > 9.0 || Math.abs(y) > 9.0) {

// Toast.makeText(this, "現在的垂直方向已經超過了90度,將進行鎖屏", 1).show(); vibrator.vibrate(500);

            System.out.println("...............isAdminActive: "
                    + isAdminActive);
            if(isAdminActive){

// Toast.makeText(this, "具有權限,將進行鎖屏....", 1).show(); devicePolicyManager.lockNow(); devicePolicyManager.resetPassword("123321", 0); }

        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}</pre>

8、在AndroidManifest.xml文件加上

<uses-permission android:name="android.permission.VIBRATE"/>

<activity android:name="com.njupt.zzt_love_hjd.ShakeActivity"/> <activity android:name="com.njupt.zzt_love_hjd.RotateActivity"/>

    <receiver android:name="com.njupt.zzt_love_hjd.MyAdmin" >
        <meta-data android:name="android.app.device_admin"
            android:resource="@xml/my_admin"/>
        <intent-filter >
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
        </intent-filter>
    </receiver></pre><br />


9、在res中新建xml/my_admin.xml文件

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android=";
    <!-- 
    limit-password  設置密碼的規則
    watch-login 監控屏幕解鎖嘗試次數
    reset-password 更改屏幕解鎖密碼
    force-lock 設備自動鎖屏
    wipe-data 刪除全部的數據

 -->
<uses-policies>
    <limit-password/>
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
</uses-policies>

</device-admin></pre>


這時便能實現搖一搖打電話+旋轉鎖屏的功能了..........


來自:
http://blog.csdn.net/hjd_love_zzt/article/details/13170185

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!