Commit cad7a1e5 by onuma

#47854 【@Form】Android12で機器連携するとアプリが落ちる

parent 01b1cdc0
......@@ -4,7 +4,6 @@ import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import jp.agentec.abook.abv.bl.common.ABVEnvironment;
import jp.agentec.abook.abv.bl.common.log.Logger;
import jp.agentec.abook.abv.launcher.android.ABVApplication;
import jp.agentec.abook.abv.launcher.android.ABVUIDataCache;
......@@ -18,6 +17,7 @@ import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
......@@ -50,9 +50,57 @@ public class LocationManagerUtil {
}
/**
* GPSが有効かチェックする
* @return 有効の場合true
*/
public boolean isLocationGpsEnabled() {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean secureLocationGpsEnabled;
if (Build.VERSION.SDK_INT < 31) {
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
secureLocationGpsEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
} else {
secureLocationGpsEnabled = gps;
}
if (!gps || !secureLocationGpsEnabled) {
return false;
}
return true;
}
/**
* NetWorkによる位置測定が有効かチェックする
* @return 有効の場合true
*/
public boolean isLocationNetWorkEnabled() {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean secureLocationNetWorkEnabled;
if (Build.VERSION.SDK_INT < 31) {
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
secureLocationNetWorkEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("network");
} else {
secureLocationNetWorkEnabled = network;
}
if (!network || !secureLocationNetWorkEnabled) {
return false;
}
return true;
}
/**
* 位置情報の取得を開始します<br>
* 成功時にlistenerのonGetLocation、失敗時にlistenerのonGetLocationFailedが呼び出されます。
*
*
*/
public void startLocationService() {
stopLocationService();
......@@ -65,55 +113,50 @@ public class LocationManagerUtil {
setLocationFailed();
return;
}
// 位置情報サービスが有効か?
boolean isGpsEnabled = isLocationGpsEnabled();
boolean isNetWorkEnabled = isLocationNetWorkEnabled();
if (!(isGpsEnabled || isNetWorkEnabled)) {
// この時点で位置情報サービスが有効でない場合は何もしない。
setLocationFailed();
return;
}
final Location lastKnownLocation = getLastKnownLocation();
if (lastKnownLocation != null) {
// 最後に取得できた位置情報があれば、とりあえず設定します。
updateLocation(lastKnownLocation, true);
// 最後に取得できた位置情報が5分以内のものであれば、これ以上処理を実行しません。
if ((new Date().getTime() - lastKnownLocation.getTime()) < SIGNIFICANTLY_NEWER) {
return;
}
}
final boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
final boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
final boolean secureLocationGpsEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
final boolean secureLocationNetWorkEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("network");
if (!(gps || network) || !(secureLocationGpsEnabled || secureLocationNetWorkEnabled)) {
// この時点で位置情報サービスが有効でない場合は何もしない。
setLocationFailed();
return;
}
final Location lastKnownLocation = getLastKnownLocation();
if (lastKnownLocation != null) {
// 最後に取得できた位置情報があれば、とりあえず設定します。
updateLocation(lastKnownLocation, true);
// 最後に取得できた位置情報が5分以内のものであれば、これ以上処理を実行しません。
if ((new Date().getTime() - lastKnownLocation.getTime()) < SIGNIFICANTLY_NEWER) {
return;
}
}
time = 0L;
// 位置情報取得の生存時間を決定するタイマーを起動します。
final Handler handler = new Handler();
locationTimer = new Timer(true);
locationTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
if (time > SERVICE_TIMEOUT) {
Logger.w(TAG, "time > SERVICE_TIMEOUT");
setLocationFailed();
return;
}
time = time + TIMER_INTERVAL;
}
});
}
}, TIMER_DELAY, TIMER_INTERVAL);
// 位置情報の取得を開始します。
if (gps) {
time = 0L;
// 位置情報取得の生存時間を決定するタイマーを起動します。
final Handler handler = new Handler();
locationTimer = new Timer(true);
locationTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
if (time > SERVICE_TIMEOUT) {
Logger.w(TAG, "time > SERVICE_TIMEOUT");
setLocationFailed();
return;
}
time = time + TIMER_INTERVAL;
}
});
}
}, TIMER_DELAY, TIMER_INTERVAL);
// 位置情報の取得を開始します。
if (isGpsEnabled) {
gpsLocationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
......@@ -137,7 +180,7 @@ public class LocationManagerUtil {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener);
}
if (network) {
if (isNetWorkEnabled) {
networkLocationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
......@@ -186,7 +229,7 @@ public class LocationManagerUtil {
/**
* 第一引数の位置情報に比べ、第二引数の位置情報がより有効であるか判定します。
*
*
* @param currentLocation
* @param newLocation
* @return
......@@ -219,14 +262,14 @@ public class LocationManagerUtil {
}
return false;
}
public static boolean isSameProvider(final String provider1, final String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}
void updateLocation(final Location location, final boolean lastKnownLocation) {
currentLocation = location;
setLocation(location);
......@@ -238,14 +281,11 @@ public class LocationManagerUtil {
public void showLoactionServiceAlert() {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null) {
final boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
final boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
// 位置情報サービスが有効か?
boolean isGpsEnabled = isLocationGpsEnabled();
boolean isNetWorkEnabled = isLocationNetWorkEnabled();
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
final boolean secureLocationGpsEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
final boolean secureLocationNetWorkEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("network");
if (!(gps || network) || !(secureLocationGpsEnabled || secureLocationNetWorkEnabled)) {
if (!(isGpsEnabled || isNetWorkEnabled)) {
ABVUIDataCache appDataCache = ABVApplication.getABVUIDataCache(context);
if (appDataCache.checkLocationServiceFlg) {
// 位置情報が有効になっていない場合は、Google Maps アプリライクなダイアログを起動します。
......@@ -305,4 +345,29 @@ public class LocationManagerUtil {
listener.onGetLocationFailed();
}
}
/**
* GPSが有効でかどうかをチェックします。
* @param context アプリのcontext
* @return 有効の場合はtrue
*/
public static boolean isLocationGpsEnabled(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean secureLocationGpsEnabled;
if (Build.VERSION.SDK_INT < 31) {
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
secureLocationGpsEnabled = android.provider.Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
} else {
secureLocationGpsEnabled = gpsEnabled;
}
if (!(gpsEnabled || secureLocationGpsEnabled)) {
return false;
}
return true;
}
}
......@@ -44,6 +44,7 @@ import jp.agentec.abook.abv.bl.data.dao.AbstractDao;
import jp.agentec.abook.abv.bl.data.dao.SppDeviceDao;
import jp.agentec.abook.abv.bl.dto.SppDeviceDto;
import jp.agentec.abook.abv.cl.util.BleManagerUtil;
import jp.agentec.abook.abv.cl.util.LocationManagerUtil;
import jp.agentec.abook.abv.cl.util.SppBluetoothConnectThread;
import jp.agentec.abook.abv.cl.util.YamatoBluetoothReceiveTask;
import jp.agentec.abook.abv.launcher.android.R;
......@@ -528,14 +529,8 @@ public class ABVCheckContentViewActivity extends ABVContentViewActivity {
private void startOkudakeBeaconScan() {
//Linkingアプリと置くだけセンサーがBluetoothで通信するのでチェック必要
if (requestBluetoothFeature(REQUEST_CODE_ENABLEBLUETOOTH_OKUDAKE)) {
LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
final boolean gpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
final boolean secureLocationGpsEnabled = android.provider.Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
//端末側の位置情報許可チェック
if (gpsEnabled || secureLocationGpsEnabled) {
if (LocationManagerUtil.isLocationGpsEnabled(this)) {
ABookPermissionHelper helper = new ABookPermissionHelper(this, ABookPermissionType.AccessFineLocation, null);
//アプリ側の位置情報許可チェック(置くだけセンサーとLinkingアプリの通信できないため)
......
......@@ -30,6 +30,7 @@ import jp.agentec.abook.abv.bl.common.Constant.DeviceType;
import jp.agentec.abook.abv.bl.common.log.Logger;
import jp.agentec.abook.abv.bl.dto.BluetoothPairingDeviceInfoDto;
import jp.agentec.abook.abv.cl.util.BleManagerUtil;
import jp.agentec.abook.abv.cl.util.LocationManagerUtil;
import jp.agentec.abook.abv.launcher.android.R;
import jp.agentec.abook.abv.ui.common.activity.ABVUIActivity;
import jp.agentec.abook.abv.ui.common.util.ABVToastUtil;
......@@ -218,19 +219,8 @@ public class BlePairingSettingActivity extends ABVUIActivity {
//BlueTooth許可チェック
if (!requestBluetoothFeature()) return;
LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
boolean gpsEnabled = false;
if (lm != null) {
gpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} else {
Logger.w(TAG, "LocationManager is null");
}
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
final boolean secureLocationGpsEnabled = android.provider.Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
//端末側の位置情報許可チェック
if (!(gpsEnabled || secureLocationGpsEnabled)) {
//端末側の位置情報許可チェッ
if (!LocationManagerUtil.isLocationGpsEnabled(this)) {
showSimpleAlertDialog(R.string.chino_machine, R.string.msg_location_device_no_allow);
return;
}
......@@ -241,7 +231,7 @@ public class BlePairingSettingActivity extends ABVUIActivity {
// BluetoothLeScannerの取得
// ※Runnableオブジェクト内でも使用できるようfinalオブジェクトとする。
BluetoothLeScanner scanner = null;
BluetoothLeScanner scanner = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
scanner = bleManagerUtil.mBluetoothAdapter.getBluetoothLeScanner();
}
......
......@@ -31,6 +31,7 @@ import jp.agentec.abook.abv.bl.data.dao.SppDeviceDao;
import jp.agentec.abook.abv.bl.dto.BluetoothPairingDeviceInfoDto;
import jp.agentec.abook.abv.bl.dto.SppDeviceDto;
import jp.agentec.abook.abv.cl.util.BleManagerUtil;
import jp.agentec.abook.abv.cl.util.LocationManagerUtil;
import jp.agentec.abook.abv.launcher.android.R;
import jp.agentec.abook.abv.ui.common.activity.ABVUIActivity;
import jp.agentec.abook.abv.ui.common.util.ABVToastUtil;
......@@ -175,14 +176,8 @@ public class SppBluetoothPairingSettingActivity extends ABVUIActivity {
//BlueTooth許可チェック
if (!requestBluetoothFeature()) return;
LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
final boolean gpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
// GPSの状態を取得(getSystemtServiceからのGPS ON/OFF取得が取れない場合があるため、secureで取得したgpsも判定するため)
final boolean secureLocationGpsEnabled = android.provider.Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED).contains("gps");
//端末側の位置情報許可チェック
if (!(gpsEnabled || secureLocationGpsEnabled)) {
if (!LocationManagerUtil.isLocationGpsEnabled(this)) {
showSimpleAlertDialog(R.string.spp_machine, R.string.msg_location_device_no_allow);
return;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment