一 : Android的蓝牙实例代码中找不到REQUEST_ENABLE_BT
【背景】
折腾:
【记录】编写Android中的蓝牙模块驱动和底层HART设备
期间,参考:
的代码:
if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}
结果找不到其中的REQUEST_ENABLE_BT。(www.61k.com)
【解决过程】
1.参考:
Issue 25492 – android – where is REQUEST_ENABLE_BT – Android Open Source Project
说是:
BluetoothAdapter.ACTION_REQUEST_ENABLE
但是实际上BluetoothAdapter没有这个ACTION_REQUEST_ENABLE
2.参考:
Error checking if Bluetooth is enabled in Android (REQUEST_ENABLE_BT cannot be resolved to a variable) – Stack Overflow
是:
private final static int REQUEST_ENABLE_BT = 1;
即可。
3.后来看到这里:
關於藍牙程式開發問題 | 癮科技
也有解释:
那個值,自己定義就好,例如:private static final int REQUEST_ENABLE_BT = 2; 在intent回call的時候,會丟回來給你,你可以藉此來知道回call的原由 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_ENABLE_BT) { if(resultCode == RESULT_OK) } } 實際上,你可以參考sdk下sample裡的bluechat,它也是自己定義的,很多書的範例名字跟它一模一樣。 |
4.实际上后来看到官网教程中的解释了:
The |
其是需要自己定义的局部常量。
【总结】
所以说,还是要自己认真看官网资料。
要稍微多往后面看看,如果找不到相关解释,再去找其他地方的解释。
扩展:刘强东 中关村 / 刘强东中关村视频 / 中关村衰落
二 : android吹裙子的实现代码
今天给大家带来安卓中的游戏,吹裙子的核心实现代码,如下:
package com.xxiyy.spl;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
public class RecordThread extends Thread {
private AudioRecord ar;
private int bs;
private static int SAMPLE_RATE_IN_HZ = 8000;
private boolean isRun = false;
public RecordThread() {
super();
bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, bs);
}
public void run() {
super.run();
ar.startRecording();
// 用于读取的 buffer
byte[] buffer = new byte[bs];
isRun = true;
while (isRun) {
int r = ar.read(buffer, 0, bs);
int v = 0;
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < buffer.length; i++) {
// 这里没有做运算的优化,为了更加清晰的展示代码
v += buffer[i] * buffer[i];
}
// 平方和除以数据总长度,得到音量大小。可以获取白噪声值,然后对实际采样进行标准化。
// 如果想利用这个数值进行操作,建议用 sendMessage 将其抛出,在 Handler 里进行处理。
Log.d("spl", String.valueOf(v / (float) r));
}
ar.stop();
}
public void pause() {
// 在调用本线程的 Activity 的 onPause 里调用,以便 Activity 暂停时释放麦克风
isRun = false;
}
public void start() {
// 在调用本线程的 Activity 的 onResume 里调用,以便 Activity 恢复后继续获取麦克风输入音量
if (!isRun) {
super.start();
}
}
}
原文中提到“平方和除以数据总长度,得到音量大小”,有些文章中提到这个音量值在不同的手机中表现得不一样,同样的发声,但出来的值相差很大。进而有通过一些计算,调整“音量”的算法,其中有两个,分别是:
1、计算了噪音,对音量进行调整: www.2cto.com
value 的 值 控制 为 0 到 100 之间 0为最小 》= 100为最大!!
int value = (int) (Math.abs((int)(v /(float)r)/10000) >> 1);
2、计算分贝值:
那个值应该是声音的振幅,并不是音量的大小,
声音的大小应该是用分贝为单位的吧,
double dB = 10*Math.log10(v/(double)r);
三 : android 实现代码关机
开始从网上搜索,通过发action的方式实现,不过一直没有成功。(www.61k.com]
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SHUTDOWN);
sendBroadcast(intent);
加权限
<uses-permission android:name="android.permission.SHUTDOWN" tools:ignore="ProtectedPermissions" />
若有成功的同学,希望留言相告,谢谢。
这里介绍我自己的方法。
1. power服务实现了关机功能
framework/base/services/java/com/android/server/power/PowerManagerService.java
/**
* Shuts down the device.
*
* @param confirm If true, shows a shutdown confirmation dialog.
* @param wait If true, this call waits for the shutdown to complete and does not return.
*/
@Override // Binder call
public void shutdown(boolean confirm, boolean wait) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
final long ident = Binder.clearCallingIdentity();
try {
shutdownOrRebootInternal(true, confirm, null, wait);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
2. PowerManager提供了reboot等接口,没有提供shutdown接口。
若是重启,实现就很简单:
PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
pm.reboot();
但是shutdown没有实现,PowerManager的实现通过IPowerManager来调用Power服务的接口。
IPowerManager是AIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录framework/base/core/java/android/os/IPowerManage.aidl
3. IPowerManager实现了shutdown接口,这里只要获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。
ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder。
而ServiceManager这个类也是HIDE的,也需要反射进行调用。
代码实现:
try { //获得ServiceManager类 Class<?> ServiceManager = Class .forName("android.os.ServiceManager"); //获得ServiceManager的getService方法 Method getService = ServiceManager.getMethod("getService", java.lang.String.class); //调用getService获取RemoteService Object oRemoteService = getService.invoke(null,Context.POWER_SERVICE); //获得IPowerManager.Stub类 Class<?> cStub = Class .forName("android.os.IPowerManager$Stub"); //获得asInterface方法 Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class); //调用asInterface方法获取IPowerManager对象 Object oIPowerManager = asInterface.invoke(null, oRemoteService); //获得shutdown()方法 Method shutdown = oIPowerManager.getClass().getMethod("shutdown",boolean.class,boolean.class); //调用shutdown()方法 shutdown.invoke(oIPowerManager,false,true); } catch (Exception e) { Log.e(TAG, e.toString(), e); }本文标题:android代码实现圆角-Android的蓝牙实例代码中找不到REQUEST_ENABLE_BT
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1