允許模擬位置在Android M下的坑 - 台部落
文章推薦指數: 80 %
按道理來說,即便用戶開啓了車載模式這時候通過上述判斷是否開啓模擬位置的代碼返回值應該是false(沒有打開模擬位置),但是這時候用於彈出了定位失敗, ...
請輸入正確的登錄賬號或密碼
註冊
忘記密碼
首頁
androidtips
正文
Androidtips(十)-->允許模擬位置在AndroidM下的坑
原創
一片枫叶_刘超
2018-09-0316:48
轉載請標明出處:一片楓葉的專欄
本文我們將講解允許模擬位置在AndroidM下的坑。
做地圖類應用的同學應該都知道爲了避免軟件模擬位置影響正常流程的進行我們一般都會判斷用戶手機是否打開了模擬位置設置,若打開了則終止用戶流程,提醒用戶關閉模擬位置設置。
在android系統的開發者選項中有一個模擬位置的選項,其作用是允許用戶通過代碼模擬設備的當前位置,比如地圖類應用需要測試在外地的使用情況,通過開啓此項選項可以通過代碼模擬位置,具體可參考我的:Android中的開發者選項
允許模擬位置的設置選項在手機的開發者選項設置中:
產品實踐:
在我們的產品下單用車中有一個取車的環節,通過手機控制開車門,而這個時候會判斷當前手機是否打開的模擬位置的功能,若打開則,提示用戶並關閉該模擬位置的功能。
(若是允許用戶打開模擬位置功能,則惡意用戶可以通過第三方的模擬位置App修改手機的定位信息,進而影響我們App的定位信息,當需要用戶在中關村還車時,在十里堡就可以通過模擬位置屏蔽這個操作了)
判斷用戶是否打開模擬位置的代碼如下:
/**
*判斷是否打開了允許虛擬位置,如果打開了則彈窗讓他去關閉
*/
publicstaticbooleanisAllowMockLocation(finalActivitycontext){
/**
*判斷用戶是否開啓了模擬位置功能
*/
booleanisOpen=Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION,0)!=0;
if(isOpen){
Config.showTiplDialog(context,null,"定位失敗,需要關閉【允許模擬位置】功能後才能使用友友用車查看附近的車輛。
","去設置",newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
context.startActivity(newIntent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
}
});
}
returnisOpen;
}
在開車門頁面中,點擊開車們按鈕,判斷用戶是否打開了模擬位置開關,若打開則提示用戶關閉:
這時候點擊去設置按鈕,則會跳轉到開發者選項中,並允許用戶關閉開發者選項。
出現的問題:
但是在AndroidM的機型中判斷邏輯出現了問題,部分三星手機打開車載模式的話,這時候再次點擊開車門的話,上述代碼會判斷出用戶開啓了模擬位置功能,這時候就會阻塞用戶的操作,並指引用戶關閉模擬位置開關。
但是AndroidM手機上已經沒有了允許模擬位置的設置開關了,取而代之的是選擇模擬位置信息應用設置按鈕。
按道理來說,即便用戶開啓了車載模式這時候通過上述判斷是否開啓模擬位置的代碼返回值應該是false(沒有打開模擬位置),但是這時候用於彈出了定位失敗,需要關閉模擬位置的彈窗,說明通過代碼判斷用戶是否打開了模擬位置返回了true。
後來經過排查得知像這種允許模擬位置等信息都是保存在系統底層的一個數據庫中,而我們的判斷代碼返回了true,則說明用戶底層的允許模擬位置數據庫值爲true。
但是這時候AndroidM中由於已經不存在允許模擬位置取而代之的是選擇模擬位置信息應用設置,相當於這是兩個設置底層數據庫變量的開關了,而我們的代碼判斷的是允許模擬位置的數據庫值,在AndroidM中並沒有更改允許模擬位置的開關,所以這樣就沒辦法更改AndroidM下的允許模擬位置的值了。
但是AndroidM上不是使用了選擇模擬信息應用設置麼?這又是什麼鬼呢?
在AndroidM中已經沒有了允許模擬位置的開發,取而代之的是:選擇模擬位置信息應用:
在AndroidM下默認的應用是無法顯示在選擇模擬信息應用中的,需要經過如下的操作纔可以:
添加debug-AndroidManifest權限
這樣經過設置之後我們的應用信息就可以顯示在模擬位置中了,其中經過測試當爲我們的應用設置了模擬位置信息之後,其只可以影響我們自己應用的定位信息,而無法影響其他應用的定位信息。
這也算android系統解決的模擬位置信息的bug吧。
允許模擬位置的BUG:
在AndroidM之前如果我們爲自己的應用選擇了允許模擬位置,則可以通過一個應用的模擬位置操作影響其他應用的定位信息,而這種操作Google認爲是不正確的。
模擬位置信息的初衷是爲了方便App的調試操作,而當這種操作影響其他應用時就可以做一些黑操作了。
比如通過模擬位置,在使用滴滴的時候模擬位置信息搶單等等。
所以爲了解決這個問題,androidM中升級了允許模擬位置設置,取而代之的是選擇模擬位置信息應用設置,通過設置這個選項,只能影響當前應用,而不能影響其他應用的定位信息。
比如,這時候我們在通過一些App模擬當前手機的定位信息,這時候就不可以影響滴滴的定位信息了。
執行AndroidM下的模擬位置操作:
在debug-AndroidManifest中添加模擬位置的權限權限
在開發者選項,選擇模擬位置信息應用中,選擇自身App
通過代碼模擬位置
publicclassRunnableMockLocationimplementsRunnable{
@Override
publicvoidrun(){
try{
//模擬位置(addTestProvider成功的前提下)
StringproviderStr=LocationManager.GPS_PROVIDER;
LocationmockLocation=newLocation(providerStr);
mockLocation.setLatitude(22);//維度(度)
mockLocation.setLongitude(113);//經度(度)
mockLocation.setAltitude(30);//高程(米)
mockLocation.setBearing(180);//方向(度)
mockLocation.setSpeed(10);//速度(米/秒)
mockLocation.setAccuracy(0.1f);//精度(米)
mockLocation.setTime(newDate().getTime());//本地時間
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){
mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
locationManager.setTestProviderLocation(providerStr,mockLocation);
}catch(Exceptione){
//防止用戶在軟件運行過程中關閉模擬位置或選擇其他應用
stopMockLocation();
}
}
}
通過代碼獲取位置信息:
//位置監聽
privateLocationListenerlocationListener=newLocationListener(){
/**
*位置信息變化時觸發
*/
publicvoidonLocationChanged(Locationlocation){
doublelat=location.getLatitude();
doublelot=location.getLongitude();
Stringstr="Latitude"+lat+"\r\nLongitude:"+lot;
textView.setText(str);
Log.i(TAG,"時間:"+location.getTime());
Log.i(TAG,"經度:"+location.getLongitude());
Log.i(TAG,"緯度:"+location.getLatitude());
Log.i(TAG,"海拔:"+location.getAltitude());
}
/**
*GPS狀態變化時觸發
*/
publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){
switch(status){
//GPS狀態爲可見時
caseLocationProvider.AVAILABLE:
Log.i(TAG,"當前GPS狀態爲可見狀態");
break;
//GPS狀態爲服務區外時
caseLocationProvider.OUT_OF_SERVICE:
Log.i(TAG,"當前GPS狀態爲服務區外狀態");
break;
//GPS狀態爲暫停服務時
caseLocationProvider.TEMPORARILY_UNAVAILABLE:
Log.i(TAG,"當前GPS狀態爲暫停服務狀態");
break;
}
}
/**
*GPS開啓時觸發
*/
publicvoidonProviderEnabled(Stringprovider){
}
/**
*GPS禁用時觸發
*/
publicvoidonProviderDisabled(Stringprovider){
}
};
查看其它App的定位信息是否收到了影響
我們打開我們的其它應用發現其定位信息並未受到影響。
也就是說androidM中的選擇模擬位置信息應用與AndroidM以下的手機中的允許模擬位置區別。
允許模擬位置與選擇模擬位置信息應用的區別:
允許模擬位置,可以通過模擬位置影響其他應用的定位信息
選擇模擬位置信息應用只能影響當前應用的定位信息
允許模擬位置與選擇模擬位置信息應用最終在系統中保存在兩個數據庫表中,且相互不影響
而我們的手機中判斷的是允許模擬位置開關,在androidM中若判斷打開了這個開關,但是系統已經關閉這個開關的設置操作,所以我們只需要屏蔽這個值即可。
最後的解決方案:
/**
*判斷是否打開了允許虛擬位置,如果打開了則彈窗讓他去關閉
*/
publicstaticbooleanisAllowMockLocation(finalActivitycontext){
booleanisOpen=Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION,0)!=0;
/**
*該判斷API是androidM以下的API,由於AndroidM中已經沒有了關閉允許模擬位置的入口,所以這裏一旦檢測到開啓了模擬位置,並且是androidM以上,則
*默認設置爲未有開啓模擬位置
*/
if(isOpen&&Build.VERSION.SDK_INT>22){
isOpen=false;
}
if(isOpen){
Config.showTiplDialog(context,null,"定位失敗,需要關閉【允許模擬位置】功能後才能使用友友用車查看附近的車輛。
","去設置",newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
context.startActivity(newIntent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS));
}
});
}
returnisOpen;
}
也就是說,當我們判斷出當前設備打開允許模擬位置時,在判斷一下手機系統的版本,若爲AndroidM以及以上,就屏蔽不管。
可能部分同學會問那麼androidM上的選擇模擬位置信息應用有影響麼?答案是否定的,由於我們的App沒有添加允許模擬位置的權限,所以其根本不會出現在選擇模擬位置應用列表,進而不會執行模擬位置的操作。
所以最終的解決方案就是,檢測設備是否開啓了模擬位置選項,若開啓了,則判斷當前設備是否爲AndroidM即以上,若是,則屏蔽不管,否則阻塞用戶操作,引導用戶關閉模擬位置選項。
發表評論
登录
所有評論
還沒有人評論,想成為第一個評論的人麼?請在上方評論欄輸入並且點擊發布.
相關文章
Androidtips(八)-->AndroidStudio打包apk,aar,jar包
轉載請標明出處:一片楓葉的專欄
文本我們將講解androidstudio打包apk,aar,jar包的相關知識。
apk包就是android系統的安裝包,這裏沒什麼好說的,aar包是android中獨有的類庫包,而jar包是j
一片枫叶_刘超
2020-06-2100:56:45
Androidtips(九)-->Android錄屏與轉化gif圖
一片枫叶_刘超
2020-02-2100:38:29
android設置edittext初始不被編輯
首先給整體的頁面的佈局
加上一下屬性
android:focusable="true"
android:focusableInTouchMode="true"
下面再加上
聲音:
音頻:
以上是百度百科對聲音和音頻的專業解釋,不管你們看沒看懂,反正我是沒看懂。
根據初中的物理知識
cyt_victory
2020-06-1519:34:43
Android使用BitmapFactory.decodeFile()文件轉圖片出現null值
最近用戶提了個單子是上傳某張圖片時會閃退,日誌顯示是壓縮圖時獲取的的bitmap爲null
最開始以爲是用戶路徑有問題,畢竟谷歌大大改了那麼多版本,又是權限,又是隔離緩存的,誰知道用戶什麼版本,什麼情況。
直到聯繫用戶拿到圖片才知道是自己丟
cyt_victory
2020-06-1012:23:38
DrawerLayout實現多樣側滑菜單效果
林佳楠
2020-05-3103:15:12
關於androidstudio的一次gradle
seaofpgy
2020-02-2312:55:58
XML文件中轉義字符
seaofpgy
2020-02-2312:55:58
AndroidWebView持久化問題(Cookie保存)
cyt_victory
2019-07-3004:03:04
AndroidToastErrorThisToastwasnotcreatedwithToast.makeText()
cyt_victory
2019-03-1900:33:48
隨筆
cyt_victory
2019-01-2518:19:49
AndroidStudio如何打包和引用aar
qyddai
2018-09-0603:49:23
kotlin.NotImplementedError:Anoperationisnotimplemented:notimplemented
cyt_victory
2018-09-0407:04:22
AndroidStudio編譯時出現Error:Executionfailedfortask':app:mergeDebugResources'.>錯誤
cyt_victory
2018-09-0407:04:21
一
一片枫叶_刘超
24小時熱門文章
最新文章
Android產品研發(二十一)-->Android中的UI優化
Androidtips(八)-->AndroidStudio打包apk,aar,jar包
Github項目解析(八)-->Activity啓動過程中獲取組件寬高的五種方式
Github項目解析(十)-->幾行代碼快速集成二維碼掃描庫
Github項目解析(七)-->防止按鈕重複點擊
最新評論文章
馬英九反駁朱立倫:“九二共識”有共識
怎樣提高性愛氛圍?4個小技巧助你一臂之力
簡單的動作就能提高性能力每天做這姿勢性能力更強大
加籟kiss266小阿梨專營巨乳大奶妹E-G奶淫蕩爆乳敏感火辣妹可奶炮足交口暴肛交大奶妹Telegram:av8526官網www.ppp8669.com
Valid7498XPDFDumpsForGreatExamPreparation
延伸文章資訊
- 1允许模拟位置在Android M 下的坑 - 开发者头条
但是Android M手机上已经没有了允许模拟位置的设置开关了,取而代之的是选择模拟位置信息应用设置按钮。 按道理来说,即便用户开启了车载模式这时候通过上述判断是否 ...
- 2求助LG V10 關於>>允許模擬位置<< 選項消失 - Mobile01
原本我LG V10 Android版本是5.0有下圖中的允許模擬位置的選項但前2天更新成Android 6.0 ... 這是否真的消失沒有這個選項,還是說藏在別的選項設定中嗎
- 3搜索结果_安卓系统有不需要开允许模拟位置的定位吗 - 百度知道
这个功能可以不用打开,打开后连接电脑会提示叫你关闭,模拟位置你关着就可以了 ... 进设置--开发人员选项--允许模拟地点,把这一项关闭如果你的设置里没有开发人员 ...
- 4Android系統內隱藏的「開發人員選項」特殊工具,讓你把手機 ...
另一個在「偵錯」中可能會用到的功能就是「允許模擬位置」,它能讓你偽裝 ... 讓你的系統在轉換頁面或選項時沒有絢麗的特效而獲得更多可用的資源。
- 5Android tips(十)-->允許模擬位置在Android M下的坑 - 程式人生
按道理來說,即便使用者開啟了車載模式這時候通過上述判斷是否開啟模擬位置的程式碼返回值應該是false(沒有開啟模擬位置),但是這時候用於彈出了定位 ...