編輯:關於Android編程
Android 6.0 以下:【開發者選項 -> 允許模擬位置】
Android 6.0 及以上:【開發者選項 -> 選擇模擬位置信息應用】
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
Android 6.0 以下:使用Settings.Secure.ALLOW_MOCK_LOCATION
判斷。
// Android 6.0 以下:是否開啟【允許模擬位置】
boolean canMockPosition = Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0
Android 6.0 及以上:沒有【允許模擬位置】選項,同時棄用了Settings.Secure.ALLOW_MOCK_LOCATION
,無法通過上面的方法判斷。增加了【選擇模擬位置信息應用】的方法,需要選擇使用模擬位置的應用。但是不知道怎麼獲取當前選擇的應用,因此通過是否能夠成功執行addTestProvider方法來進行判斷,如果沒有選擇當前的應用,則addTestProvider會拋出異常。(有沒有人知道,有沒有人知道。。。)
boolean hasAddTestProvider = false;
boolean canMockPosition = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0)
|| Build.VERSION.SDK_INT > 22;
if (canMockPosition && hasAddTestProvider == false) {
try {
String providerStr = LocationManager.GPS_PROVIDER;
LocationProvider provider = locationManager.getProvider(providerStr);
if (provider != null) {
locationManager.addTestProvider(
provider.getName()
, provider.requiresNetwork()
, provider.requiresSatellite()
, provider.requiresCell()
, provider.hasMonetaryCost()
, provider.supportsAltitude()
, provider.supportsSpeed()
, provider.supportsBearing()
, provider.getPowerRequirement()
, provider.getAccuracy());
} else {
locationManager.addTestProvider(
providerStr
, true, true, false, false, true, true, true
, Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);
}
locationManager.setTestProviderEnabled(providerStr, true);
locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
// 模擬位置可用
hasAddTestProvider = true;
canMockPosition = true;
} catch (SecurityException e) {
canMockPosition = false;
}
}
private class RunnableMockLocation implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(INTERVEL);
if (hasAddTestProvider() == false) {
continue;
}
try {
// 模擬位置(addTestProvider成功的前提下)
String providerStr = LocationManager.GPS_PROVIDER;
Location mockLocation = new Location(providerStr);
mockLocation.setLatitude(22); // 維度(度)
mockLocation.setLongitude(113); // 經度(度)
mockLocation.setAltitude(30); // 高程(米)
mockLocation.setBearing(180); // 方向(度)
mockLocation.setSpeed(10); //速度(米/秒)
mockLocation.setAccuracy(0.1f); // 精度(米)
mockLocation.setTime(new Date().getTime()); // 本地時間
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
locationManager.setTestProviderLocation(providerStr, mockLocation);
} catch (Exception e) {
// 防止用戶在軟件運行過程中關閉模擬位置或選擇其他應用
stopMockLocation();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 停止模擬位置,以免啟用模擬數據後無法還原使用系統位置
* 若模擬位置未開啟,則removeTestProvider將會拋出異常;
* 若已addTestProvider後,關閉模擬位置,未removeTestProvider將導致系統GPS無數據更新;
*/
public void stopMockLocation() {
if (hasAddTestProvider) {
try {
locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
// 若未成功addTestProvider,或者系統模擬位置已關閉則必然會出錯
}
hasAddTestProvider = false;
}
}
Android 利用ContentProvider獲取聯系人信息。在寫代碼前我們首先看一下運行的效果運行效果如下:點了獲取聯系人就展示如下效果讀取聯系人信息的
今天給大家講講有關自定義對話框的相關內容,前面兩篇都在在利用系統提供的函數來實現對話框,但局限性太大,當我們想自己定義視圖的時候,就不能利用系統函數了,就需要我們這裡的自
前言或許你知道了jni的簡單調用,其實不算什麼百度谷歌一大把,雖然這些jni絕大多數情況下都不會讓我們安卓工程師來弄,畢竟還是有點難,但是我們還是得打破砂鍋知道為什麼這樣
一般在本地進行OTA升級時,將升級包拷貝到SD卡,然後進入recovery模式選擇升級包進行升級,但不是很方便,於是做了一個小應用,通過調用RecoverySystem類