61阅读

android代码实现圆角-Android的蓝牙实例代码中找不到REQUEST_ENABLE_BT

发布时间:2018-03-23 所属栏目:沉浸式状态栏代码实现

一 : 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.实际上后来看到官网教程中的解释了:

TheREQUEST_ENABLE_BTconstant passed tostartActivityForResult()is a locally defined integer (which must be greater than 0), that the system passes back to you in youronActivityResult()implementation as therequestCodeparameter.

其是需要自己定义的局部常量。

【总结】

所以说,还是要自己认真看官网资料。

要稍微多往后面看看,如果找不到相关解释,再去找其他地方的解释。

扩展:刘强东 中关村 / 刘强东中关村视频 / 中关村衰落

二 : 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
本文地址: http://www.61k.com/1166109.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1