欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android手機屏幕敲擊解鎖功能代碼

 更新時間:2016年07月05日 10:29:42   作者:ztysir  
Android手機支持敲擊屏幕解鎖,敲擊屏幕解鎖是一項很實用的功能,本文以android平臺為例使用java代碼實現(xiàn)Android手機屏幕敲擊解鎖功能,非常不錯,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧

1.前言

  現(xiàn)在市面上有不少Android手機支持敲擊屏幕解鎖,敲擊屏幕解鎖是一項很實用的功能,但一來只支持敲擊屏幕,二來只能用于解鎖或鎖屏,再者我們應(yīng)用層的開發(fā)者切不進去,完全無法玩起來。開發(fā)者,開發(fā)者,我們既然身為開發(fā)者何不搞點大新聞,那么這次我來教教各位如何用代碼來實現(xiàn)手機的敲擊識別,聽起來是不是很有趣,有些躍躍欲試呢。事實上在ios上已經(jīng)有實現(xiàn)這個功能的應(yīng)用:Knock,一款敲擊來解鎖Mac電腦的應(yīng)用,售價4.99美元,約為33人民幣。有時候真想去做ios開發(fā),可以開心的為自己的應(yīng)用定價,愉悅的掙外快。言歸正傳,既然ios可以實現(xiàn),那我們Android自然不能落伍,現(xiàn)在我就帶領(lǐng)大家來用代碼實現(xiàn)手機的敲擊識別吧。

  本文以Java為示例語言,以Android為示例平臺。

2.功能實現(xiàn)

2.1.實現(xiàn)思路

  說到敲擊識別,你們會考慮使用什么來實現(xiàn)呢,傳感器?對,沒錯,作為手機手勢姿態(tài)識別的唯一途徑,我們自然需要使用傳感器來實現(xiàn)對敲擊的識別,但Android傳感器種類繁多,我們應(yīng)該選擇哪一個呢?

  在Android2.3的時代,Android系統(tǒng)就已經(jīng)定義了11個傳感器,到了現(xiàn)在Android6.0的時代,系統(tǒng)定義的傳感器數(shù)目已經(jīng)達到26個,這么多傳感器我們到底用哪一個呢,事實上我們只需要考慮2.3時代提供的那11個傳感器即可,因為一方面后期加入的傳感器部分如心跳傳感器等需要硬件支持,導(dǎo)致很多手機無法支持此類傳感器,另一方面2.3時代的11個傳感器功能已經(jīng)相當(dāng)強大,可以支持絕大多數(shù)手勢姿態(tài)的識別,那么現(xiàn)在我來列舉一下上述11個傳感器:

SENSOR_TYPE_ACCELEROMETER 加速度
  SENSOR_TYPE_MAGNETIC_FIELD 磁力
  SENSOR_TYPE_ORIENTATION 方向
  SENSOR_TYPE_GYROSCOPE 陀螺儀
  SENSOR_TYPE_LIGHT 光線感應(yīng)
  SENSOR_TYPE_PRESSURE       壓力
  SENSOR_TYPE_TEMPERATURE     溫度 
  SENSOR_TYPE_PROXIMITY       接近
  SENSOR_TYPE_GRAVITY 重力
  SENSOR_TYPE_LINEAR_ACCELERATION 線性加速度
  SENSOR_TYPE_ROTATION_VECTOR 旋轉(zhuǎn)矢量

  關(guān)于這11個傳感器的詳細描述,各位可以去http://www.dbjr.com.cn/article/87940.htm查看,事實上我一直懷疑LG G3的敲擊解鎖與光線傳感器或接近傳感器有關(guān),因為我用手指懸浮在LG G3的頭部正上方時一直無法敲擊解鎖,移開后恢復(fù)正常,而敲擊鎖屏應(yīng)該只和觸摸屏相關(guān),因為無論我怎么遮擋傳感器,敲擊鎖屏的功能完全不受影響。

  言歸正傳,對這11個傳感器有所了解后,我們需要選擇哪個或哪些傳感器來實現(xiàn)功能呢,我們來模擬一下手機敲擊的情況,將手機平放在桌面上,手指敲擊手機的時候,手指給了手機一個力,同時桌面給予手機一個反作用力,考慮桌面不形變的情況下,手機受力平衡加速度為0,但這時手機的加速度傳感器數(shù)據(jù)是否會有變化呢,答案是會的,手機加速度傳感器的數(shù)據(jù)會有一段短暫但明顯的變化,為什么呢,手機受力平衡加速度為0是因為它是一個整體,但內(nèi)部構(gòu)件還是會受到相互之間復(fù)雜的力的左右,并非受力的同時就達到受力平衡的,其實換個思路。用一個和手機形狀相似內(nèi)部光滑的容器,容器里面放幾個玻璃球,敲擊幾下,容器不會移動,但玻璃球是不是移動了呢。雖然手機內(nèi)部的構(gòu)件遠比玻璃球穩(wěn)定,但也得遵循基本法,老老實實接受力的作用。

  上述場景是平放于桌面的場景,實際生活的場景往往更加復(fù)雜多樣,但無論處于哪種場景,毫無疑問對手機的敲擊操作都應(yīng)該導(dǎo)致加速度傳感器傳出數(shù)據(jù)的明顯變化,那么我們現(xiàn)在就明白了應(yīng)該選擇什么傳感器作為我們敲擊識別的工具了吧,但加速度相關(guān)的傳感器有兩個,加速度傳感器和線性加速度傳感器,我們應(yīng)該選擇哪一個呢,加速度傳感器提供的數(shù)據(jù)是重力影響下的手機加速度,線性加速傳感器提供的數(shù)據(jù)是排除重力影響的手機加速度,可以直觀的反映排除重力后手機的受力情況,很合適用以敲擊識別,那我們是否就應(yīng)該選擇線性加速度傳感器呢,恰恰相反,我們要選擇加速度傳感器,Android提供的線性加速度傳感器基于軟件的,不同平臺對于線性加速傳感器的處理未必相同,事實上,在敲擊三星S4,LG G3中一款機型的背面,就出現(xiàn)線性加速度傳感器傳出的數(shù)據(jù)沒有較大變化的情況,保險起見,我們還是選用基于硬件的加速度傳感器更合適一些。順便吐槽一句,當(dāng)時看到壓力傳感器的時候,我還以為監(jiān)測作用于手機的壓力的傳感器,那無疑是很適合用于識別敲擊,后面看到描述才知道是監(jiān)測壓強的。

  如上所說,對手機的敲擊操作會導(dǎo)致加速度傳感器傳出數(shù)據(jù)的明顯變化,故而本次功能實現(xiàn)中,判斷是否有敲擊操作的方法是檢測手機線性加速度相比正常情況是否有明顯變化。在功能實現(xiàn)過程中為排除重力的影響,需要對加速度傳感器的數(shù)據(jù)進行處理將其轉(zhuǎn)化為線性加速度,因為轉(zhuǎn)化為線性加速度是一個需要校準的過程,所以需要先投入一定數(shù)目的數(shù)據(jù)用于校準以獲得更精確的線性加速度,同時考慮到現(xiàn)實生活存在可能導(dǎo)致誤識別的場景,比如搖動手機會帶給手機一個較長時間且明顯的線性加速度變化,所以提出穩(wěn)態(tài)的概念,將手機處于相對穩(wěn)定,沒有長時間出現(xiàn)明顯線性加速變化的狀況視為穩(wěn)態(tài),在穩(wěn)態(tài)的情況下才會進行對敲擊的識別,另外此次敲擊識別考慮到對手機邊框的敲擊使用可能性過低,因此僅考慮識別對手機屏幕或背面的敲擊,這樣在識別的過程中可忽略X,Y軸的數(shù)據(jù),僅考慮Z軸的線性加速度。

2.2.功能簡介

  本次實現(xiàn)的功能是識別對手機屏幕或背面的敲擊操作,功能實現(xiàn)流程: 注冊傳感器,采集數(shù)據(jù),投入指定數(shù)目的數(shù)據(jù)校準以獲取較精準的線性加速度,校準結(jié)束后判斷當(dāng)前是否穩(wěn)態(tài),如果為非穩(wěn)態(tài),則等待下次數(shù)據(jù),如果為穩(wěn)態(tài),則調(diào)用方法判斷是否存在敲擊操作,在進行敲擊識別的同時也將處理得到的線性加速度和最近敲擊次數(shù),穩(wěn)態(tài)狀態(tài)顯示到界面上去,

2.3.功能實現(xiàn)

2.3.1.獲取傳感器數(shù)據(jù) 

 注冊傳感器的方法屬于系統(tǒng)原生的方法,就不過多講解,不過需要注意一點,在注冊加速度傳感器時標識傳感器數(shù)據(jù)采樣間隔的參數(shù)最好使用SENSOR_DELAY_GAME,因為敲擊導(dǎo)致的加速度數(shù)據(jù)變化很短暫,如果使用SENSOR_DELAY_UI或SENSOR_DELAY_NORMAL往往采集不到敲擊引發(fā)的加速度變化,當(dāng)然如果使用SENSOR_DELAY_FASTEST自然不會有這個問題,但性能消耗會比較大。

  注冊傳感器后就可以在回調(diào)方法里等待處理數(shù)據(jù), 下面我給出實現(xiàn)代碼,綜合代碼講解實現(xiàn)過程。

public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor == null) {
return;
}
if (sensorEvent.sensor.getType() == accelerometerSensorType) {
float accelerationZ = sensorEvent.values[2];
if (accelerationZ > 0) {
recognitionKnockRatio = 20;
recognitionUniqueRatio = 10;
smoothSectionMaxRatio = 5f;
} else {
recognitionKnockRatio = 7.5f;
recognitionUniqueRatio = 6;
smoothSectionMaxRatio = 2.5f;
}
gravityZ = alpha * gravityZ + (1 - alpha) * accelerationZ;
linearAccelerationZ = accelerationZ - gravityZ;
if (calibrateLinearAcceleration) {
calibrateLinearAccelerationIndex++;
if (calibrateLinearAccelerationIndex <= calibrateLinearAccelerationSectionNumber) {
return;
}
calibrateLinearAcceleration = false;
}
if (sensorDataShowIndex >= sensorDataShowNumber) {
sensorDataShowIndex = sensorDataShowNumber - sensorDataShowDurationNumber;
Iterator<?> it = linearAccelerationZShowList.listIterator(0);
for (int i = 0; i < sensorDataShowDurationNumber; i++) {
it.next();
it.remove();
}
MainActivity.UpdateSensorData(linearAccelerationZShowList);
}
linearAccelerationZShowList.add(linearAccelerationZ);
sensorDataShowIndex++;
if (!stable) {
linearAccelerationZList.add(linearAccelerationZ);
if (linearAccelerationZList.size() >= stableSectionNumber) {
stableRecognition();
linearAccelerationZList.clear();
}
return;
}
knockRecognition(linearAccelerationZ);
}
}

  傳感器數(shù)據(jù)回調(diào)的方法中對加速度傳感器獲取的數(shù)據(jù)分別進行了處理,首先,根據(jù)z軸加速度的正負,為recognitionKnockRatio,recognitionUniqueRatio,smoothSectionMaxRatio三個變量賦予不同的數(shù)值,至于為什么要進行這樣處理,是因為對Android手機實際進行敲擊操作發(fā)現(xiàn),加速度傳感器對正面敲擊操作反饋敏感,對背面敲擊操作反饋相對遲鈍,反饋到數(shù)據(jù)層面就是,敲擊正面導(dǎo)致的加速度傳感器數(shù)據(jù)變化相比敲擊背面明顯很多,故而針對敲擊屏幕和敲擊背面要分配不同的數(shù)值,然而事實上站在手機的角度,運用現(xiàn)在的數(shù)據(jù)是完全無法分析敲擊操作導(dǎo)致的加速度明顯變化來源于敲擊正面還是敲擊背面,所以就使用z軸加速度的正負來簡單判斷,畢竟絕大多數(shù)情況下z軸加速度為正,那就是手機背面偏向地面,用戶更可能敲擊手機屏幕,而為負就是手機屏幕偏向地面,用戶更可能敲擊手機背面。至于導(dǎo)致敲擊屏幕和敲擊背面加速度傳感器反饋敏感程度不同這種情況的原因不外乎兩個,一是加速度傳感器相比于背面距離屏幕更近,再者就是Android手機外殼的問題了,這一點在LG G3上尤為明顯,LG G3的是有一定弧度的塑料外殼,在背面敲擊引發(fā)的傳感器數(shù)據(jù)變化相比于敲擊屏幕要低很多,而金屬外殼的三星S6,在背面敲擊引發(fā)的傳感器數(shù)據(jù)變化接近于敲擊屏幕。事實上上述三個系數(shù)屬于經(jīng)驗系數(shù),并且對于不同類型手機盡量提供不同的數(shù)值,原因可參見剛才所說的LG G3和三星S6,再一次感慨Android手機的多樣性,Android手機種類太多,硬件設(shè)計的不同導(dǎo)致在一款手機上適用的系數(shù)在另一款手機上可能完全無法適用,要是如iphone一樣只有那幾款機型的話無疑好處理很多。

  接著對加速度進行濾波處理以獲取線性加速度,獲取線性加速度的方法參考了Android SensorEvent源碼中建議的方法:

* <p>
* It should be apparent that in order to measure the real acceleration of
* the device, the contribution of the force of gravity must be eliminated.
* This can be achieved by applying a <i>high-pass</i> filter. Conversely, a
* <i>low-pass</i> filter can be used to isolate the force of gravity.
* </p>
*
* <pre class="prettyprint">
*
* public void onSensorChanged(SensorEvent event)
* {
* // alpha is calculated as t / (t + dT)
* // with t, the low-pass filter's time-constant
* // and dT, the event delivery rate
*
* final float alpha = 0.8;
*
* gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
* gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
* gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
*
* linear_acceleration[0] = event.values[0] - gravity[0];
* linear_acceleration[1] = event.values[1] - gravity[1];
* linear_acceleration[2] = event.values[2] - gravity[2];
* }
* </pre>

  通過高通濾波和低通濾波對加速度進行處理排除重力影響以獲取線性加速度,但在此過程中是需要傳入一定數(shù)量的數(shù)據(jù)進行校準以獲取較精準的線性加速度,在這里我們設(shè)定calibrateLinearAccelerationSectionNumber作為用以校準數(shù)據(jù)的數(shù)據(jù)長度,用calibrateLinearAccelerationIndex和calibrateLinearAcceleration來控制何時校準結(jié)束。

  校準結(jié)束后使用linearAccelerationZShowList存儲顯示到應(yīng)用界面上的傳感器線性加速度,接著如果處于非穩(wěn)態(tài),則開始穩(wěn)態(tài)識別,判斷當(dāng)前狀態(tài)是否穩(wěn)態(tài),如果處于穩(wěn)態(tài)狀態(tài)則開始敲擊識別。

2.3.2.穩(wěn)態(tài)識別 

  如上文提到的,用戶如果進行搖動手機之類的操作,是會產(chǎn)生明顯的加速度變化,很有可能導(dǎo)致誤識別的情況,所以在此提出了穩(wěn)態(tài)的概念,即為手機加速度沒有長時間明顯變化的狀態(tài),延伸到現(xiàn)實場景就是用戶沒有對手機進行明顯移動的狀態(tài),嚴格來說,一般用戶在對手機進行明顯移動如搖動手機的同時進行敲擊操作的可能性極低,所以可以將穩(wěn)態(tài)這個概念正式運用到功能實現(xiàn)中。

  已經(jīng)了解穩(wěn)態(tài)這個概念,那我們應(yīng)該如何定義什么情況屬于穩(wěn)態(tài),什么情況屬于非穩(wěn)態(tài),下面我給出實現(xiàn)代碼,綜合代碼進行講解。

private void stableRecognition() {
int exceptionNumber = 0;
float accelerationZValue;
float minAccelerationZValue = Integer.MAX_VALUE;
float maxAccelerationZValue = Integer.MIN_VALUE;
for (int i = stableSectionNumber - 1; i >= 0; i--) {
accelerationZValue = linearAccelerationZList.get(i);
if (Math.abs(accelerationZValue) > maxStableOffset) {
exceptionNumber++;
} else {
if (accelerationZValue > maxAccelerationZValue) {
maxAccelerationZValue = accelerationZValue;
} else {
if (accelerationZValue < minAccelerationZValue) {
minAccelerationZValue = accelerationZValue;
}
}
}
}
stable = exceptionNumber <= maxExceptionNumber;
if (stable) {
if (linearAccelerationZStableSection == 0) {
linearAccelerationZStableSection =
(maxAccelerationZValue - minAccelerationZValue) / 2;
}
if (linearAccelerationZStableSection > maxStableOffset) {
linearAccelerationZStableSection = maxStableOffset;
}
}
MainActivity.UpdateStable(stable);
LogFunction.log("stable", "" + stable);
LogFunction.log("exceptionNumber", "" + exceptionNumber);
LogFunction.log("linearAccelerationZStableSection", "" + linearAccelerationZStableSection);
}

  在此次功能實現(xiàn)過程中,判斷穩(wěn)態(tài)的方式是采樣50個點,然后計算每個點的絕對值,如果大于最大偏差maxStableOffset就視為異常點,異常點大于最大異常點數(shù)目maxExceptionNumber就視為非穩(wěn)態(tài),反之視為穩(wěn)態(tài)。判斷穩(wěn)態(tài)結(jié)束后,如果處于穩(wěn)態(tài)則將剔除異常點數(shù)據(jù)后的Z軸最大加速度和最小加速度之間差值的一半視為波動區(qū)間linearAccelerationZStableSection。maxStableOffset與maxExceptionNumber相同都是經(jīng)驗系數(shù),是對Android手機實際提供的不同場景下的線性加速度分析得出的?,F(xiàn)在存在一個問題,那就是如果原本狀態(tài)處于穩(wěn)態(tài),然后用戶突然對手機進行操作,將手機狀態(tài)轉(zhuǎn)變?yōu)榉欠€(wěn)態(tài)那要如何處理,不要著急,這個問題會在敲擊識別的過程中進行處理的。

2.3.3.敲擊識別

  現(xiàn)在到了整個功能實現(xiàn)最核心的地方:敲擊識別,如上文所說敲擊會引起加速度傳感器數(shù)據(jù)的明顯變化,但是我們要如何使用代碼進行檢測敲擊,以及如何排除用戶對手機其他操作引發(fā)的誤識別問題,事實上這些問題都會在這里進行處理,現(xiàn)在我給出實現(xiàn)代碼,綜合代碼進行講解。

private void knockRecognition(float linearAccelerationZ) {
float linearAccelerationZAbsolute = Math.abs(linearAccelerationZ);
float linearAccelerationZAbsoluteRadio =
linearAccelerationZAbsolute / linearAccelerationZStableSection;
if (linearAccelerationZAbsoluteRadio > recognitionUniqueRatio) {
uniqueLinearAccelerationZList.add(linearAccelerationZ);
currentForecastNumber = forecastNumber;
} else {
if (uniqueLinearAccelerationZList.size() > 0) {
if (currentForecastNumber > 0) {
currentForecastNumber--;
} else {
handleUniqueLinearAccelerationZ();
}
}
}
if (linearAccelerationZAbsoluteRadio < smoothSectionMaxRatio) {
float offsetWeight = 0.001f;
linearAccelerationZStableSection =
weightedMean(offsetWeight, linearAccelerationZAbsolute,
linearAccelerationZStableSection);
}
}

  knockRecognition就是用來處理線性加速度進而確認是否有敲擊操作的方法,首先對傳入?yún)?shù)線性加速度進行處理,獲取線性加速度絕對值,接著如果線性加速度絕對值與波動區(qū)間的比值大于recognitionUniqueRatio,那就認為手機正在受到力的作用,為確定是敲擊操作還是用戶其他操作,先將線性加速度加入到獨特線性加速度列表中, 反之如果小于等于recognitionUniqueRatio,那就認為手機處于相對穩(wěn)定狀態(tài),在此時如果此時獨特線性加速度列表長度大于0,如果currentForecastNumber大于0,則currentForecastNumber減1,如果currentForecastNumber小于等于0,則開始處理獨特線性加速度列表,而在處理獨特線性加速度列表的過程中正式開始識別是否敲擊,以及當(dāng)前狀態(tài)是否轉(zhuǎn)變?yōu)榉欠€(wěn)態(tài)。在進行上述操作的同時,如果線性加速度絕對值與波動區(qū)間的比值小于smoothSectionMaxRatio則用線性加速度絕對值來平滑波動區(qū)間。

  在這里,大家肯定對currentForecastNumber有疑問,這個變量代表什么含義,為什么會有這個變量,原因是這樣的,一次敲擊可能導(dǎo)致兩個接近但不連續(xù)的獨特線性加速度。如果沒有currentForecastNumber這個變量就會導(dǎo)致現(xiàn)實的一次敲擊可能被識別為兩次敲擊操作。

  而如果線性加速度絕對值與波動區(qū)間的比值小于smoothOffsetMaxRatio則用線性加速度絕對值來平滑波動區(qū)間,是因為一方面手機的狀態(tài)可能隨時改變,波動區(qū)間應(yīng)該隨著手機狀態(tài)的改變跟著改變,另一方面穩(wěn)態(tài)識別時計算的波動區(qū)間可能存在問題,并不能正確的反映當(dāng)前手機的加速度波動,這個時候就需要根據(jù)最新的數(shù)據(jù)進行學(xué)習(xí)以平滑波動區(qū)間,而為什么比值要小于smoothSectionMaxRatio是因為比值大于smoothSectionMaxRatio的基本是非正常情況的線性加速度,不適合用于平滑波動區(qū)間,而如果現(xiàn)實情況中的線性加速度與波動區(qū)間比值基本都超過smoothSectionMaxRatio,那說明現(xiàn)在手機多半處于非穩(wěn)態(tài)狀態(tài)了,等待新的穩(wěn)態(tài)識別重置波動區(qū)間即可,另外如上文所說,recognitionUniqueRatio,smoothOffsetMaxRatio屬于經(jīng)驗系數(shù),完全可以自主設(shè)定。

private void handleUniqueLinearAccelerationZ() {
LogFunction.log("linearAccelerationZStableSection", "" + linearAccelerationZStableSection);
int recognitionKnockNumber = 1;
int uniqueLinearAccelerationZListLength = uniqueLinearAccelerationZList.size();
float accelerationZOffsetAbsolute;
float maxAccelerationZOffsetAbsolute = 0;
for (int i = 0; i < uniqueLinearAccelerationZListLength; i++) {
accelerationZOffsetAbsolute = Math.abs(uniqueLinearAccelerationZList.get(i));
if (maxAccelerationZOffsetAbsolute < accelerationZOffsetAbsolute) {
maxAccelerationZOffsetAbsolute = accelerationZOffsetAbsolute;
}
LogFunction.log("uniqueLinearAccelerationZList index" + i,
"" + uniqueLinearAccelerationZList.get(i));
}
uniqueLinearAccelerationZList.clear();
LogFunction.log("uniqueLinearAccelerationZListLength",
"" + uniqueLinearAccelerationZListLength);
if (uniqueLinearAccelerationZListLength > unstableListLength) {
stable = false;
MainActivity.UpdateStable(stable);
return;
}
LogFunction.log("maxAccelerationZOffsetAbsolute / linearAccelerationZStableSection",
"" + (maxAccelerationZOffsetAbsolute / linearAccelerationZStableSection));
if (maxAccelerationZOffsetAbsolute >
linearAccelerationZStableSection * recognitionKnockRatio) {
LogFunction.log("recognitionKnockRatio", "" + recognitionKnockRatio);
LogFunction.log("recognitionUniqueRatio", "" + recognitionUniqueRatio);
knockRecognitionSuccess(recognitionKnockNumber);
}
}

  終于到了最后的handleUniqueLinearAccelerationZ方法,顧名思義,就是用來處理獨特線性加速度列表的,在這個方法內(nèi),進行了敲擊識別和穩(wěn)態(tài)狀態(tài)是否轉(zhuǎn)變的判定,如果獨特線性加速度列表長度超過非穩(wěn)態(tài)獨特線性加速度列表長度,則認為現(xiàn)在手機狀態(tài)此刻狀態(tài)轉(zhuǎn)變?yōu)榉欠€(wěn)態(tài)并結(jié)束方法,如果發(fā)現(xiàn)加速度偏移數(shù)據(jù)列表中最大偏移值超過波動區(qū)間一定倍數(shù)則識別為敲擊。

3.總結(jié)

  至此,敲擊識別的流程我們算是走完了。事實上我提供的敲擊識別方法還是存在著誤識別的情況,ios的Knock我使用過,擁有著符合價格的能力,識別率相當(dāng)?shù)暮茫恢浪麄兪峭ㄟ^機器學(xué)習(xí)還是別的方法歸結(jié)了一套他們的識別系數(shù),當(dāng)然我在此提供的敲擊識別僅僅是一種敲擊識別的方法,我也無法說它成熟,因為并沒有經(jīng)過真正用戶的考驗,大家完全可以按照自己的思想更換算法甚至更換傳感器來實現(xiàn)自己的敲擊識別,而我在此其實相當(dāng)于提供一個實現(xiàn)思路。

  這是第三篇博客了,第一篇博客屬于試水就選擇了做過的一個比較偏門但并不好處理的一個小模塊:為MP3文件寫入ID3標簽,第二篇博客選擇了一個很嚴謹?shù)膶嵱媚K:音頻合成,前兩個模塊都有一個共同點就是各種規(guī)范已經(jīng)很明確,雖然代碼實現(xiàn)上可能有所不同但實現(xiàn)思路必然相同,而第三篇的博客的敲擊檢測無疑寬松很多,所以我也是第一次寫了實現(xiàn)思路這一小節(jié),因為我也不確定我的實現(xiàn)思路是否完全正確,作為傳感器的實際應(yīng)用是存在著無數(shù)的可能性,我們完全可以按照自己的想法去嘗試,錯了大不了換一個方向罷了。

以上所述是小編給大家介紹的Android手機屏幕敲擊解鎖實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android監(jiān)聽來電和去電的實現(xiàn)方法

    Android監(jiān)聽來電和去電的實現(xiàn)方法

    這篇文章主要介紹了Android監(jiān)聽來電和去電的實現(xiàn)方法,涉及Android中BroadcastReceiver組件的使用及AndroidManifest.xml權(quán)限操作的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • AsyncTask類實例詳解

    AsyncTask類實例詳解

    這篇文章主要介紹了AsyncTask類實例詳解
    2017-10-10
  • Android底部導(dǎo)航欄的動態(tài)替換方案

    Android底部導(dǎo)航欄的動態(tài)替換方案

    這篇文章主要為大家詳細介紹了Android底部導(dǎo)航欄的動態(tài)替換方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android打開圖庫選擇照片功能代碼

    Android打開圖庫選擇照片功能代碼

    這篇文章主要介紹了Android打開圖庫選擇照片功能代碼以及實現(xiàn)流程分析,對此有需要的朋友參考學(xué)習(xí)下吧。
    2018-02-02
  • android驗證郵箱輸入是否合法

    android驗證郵箱輸入是否合法

    這篇文章主要為大家詳細介紹了android驗證郵箱輸入是否合法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android開發(fā)中使用WebView控件瀏覽網(wǎng)頁的方法詳解

    Android開發(fā)中使用WebView控件瀏覽網(wǎng)頁的方法詳解

    這篇文章主要介紹了Android開發(fā)中使用WebView控件瀏覽網(wǎng)頁的方法,結(jié)合實例形式較為詳細的總結(jié)分析了Android WebView控件的功能、布局、設(shè)置、常用方法及相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android開發(fā)之資源文件用法實例總結(jié)

    Android開發(fā)之資源文件用法實例總結(jié)

    這篇文章主要介紹了Android開發(fā)之資源文件用法,結(jié)合實例形式總結(jié)分析了Android開發(fā)過程中針對資源文件的常見操作技巧,需要的朋友可以參考下
    2016-02-02
  • AndroidStudio 設(shè)置格式化斷行寬度教程

    AndroidStudio 設(shè)置格式化斷行寬度教程

    這篇文章主要介紹了AndroidStudio 設(shè)置格式化斷行寬度教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android 擴大 View 的點擊區(qū)域的方法

    Android 擴大 View 的點擊區(qū)域的方法

    這篇文章主要介紹了Android 擴大 View 的點擊區(qū)域的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 基于flutter?sound插件實現(xiàn)錄音與播放功能

    基于flutter?sound插件實現(xiàn)錄音與播放功能

    這篇文章主要介紹了基于flutter?sound插件實現(xiàn)錄音與播放功能,介紹了如何錄音,如何播放本地和遠程音頻文件,以及如何實現(xiàn)動畫,在錄制完音頻文件后如何上傳,這些都是我們平常使用這個功能會遇到的問題。在使用的過程中遇到的問題也有列出,需要的朋友可以參考下
    2022-05-05

最新評論