Фоновое сканирование библиотеки маяков Android приводит к сбою приложения переднего плана

Я пытаюсь создать приложение для поиска маяков. Приложение переднего плана работает нормально. Однако, когда я пытаюсь включить фоновое сканирование в приложение, это приводит к сбою приложения. Обычно после запуска приложение запрашивает разрешения, закрывается и появляется уведомление о фоновом сканировании. Таким образом, каждый раз, когда фоновая служба обнаруживает маяк, она закрывает приложение.

Я бы хотел как-то остановить фоновое сканирование, когда приложение выходит на передний план. Я пробовал использовать

regionbootstrap.disable();

Но это не решает мою проблему.

Я использую библиотеку маяков для Android 2.11-beta1

public class whereismybag extends Application implements BootstrapNotifier, 
RangeNotifier, BeaconConsumer {
private static final String TAG = "wherebg";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);

@Override
public void onCreate() {
    super.onCreate();



    Log.d(TAG, "Background scanning started up");
    Region region = new Region("com.example.utsav.whereismybeacon", null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);

    // To detect proprietary beacons, you must add a line like below corresponding to your beacon
    // type.  Do a web search for "setBeaconLayout" to get the proper expression.
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));

    // wake up the app when any beacon is seen (you can specify specific id filers in the parameters below)


    backgroundPowerSaver = new BackgroundPowerSaver(this);
    beaconManager.setBackgroundScanPeriod(5000L);
    beaconManager.setBackgroundBetweenScanPeriod(6000L);}




private void sendNotification(String text) {
    NotificationCompat.Builder builder =
            (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                    .setContentTitle("Where is My bag?")
                    .setContentText(text)
                    .setSmallIcon(R.drawable.wimbicon);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntent(new Intent(this, MainActivity.class));
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                    0,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
    builder.setContentIntent(resultPendingIntent);
    NotificationManager notificationManager =
            (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, builder.build());
}

public void didEnterRegion(Region region) {
    Log.d(TAG, "Got a didEnterRegion call");
    // This call to disable will make it so the activity below only gets launched the first time a beacon is seen (until the next time the app is launched)
    // if you want the Activity to launch every single time beacons come into view, remove this call.
    regionBootstrap.disable();
    try {
        beaconManager.startRangingBeaconsInRegion(region);
    }
    catch (RemoteException e) {
        if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging");
    }
    sendNotification("Detecting a bag! Tap to launch app.");
    regionBootstrap.disable();
    try {
        beaconManager.startRangingBeaconsInRegion(region);

    } catch (RemoteException e) {
        e.printStackTrace();
    }
}
    /*Intent intent = new Intent(whereismybag.this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    this.startActivity(intent);*/


@Override
public void didExitRegion(Region region) {
    try {
        beaconManager.stopRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}


@Override
public void didDetermineStateForRegion(int state, Region region) {
    Log.d(TAG,"I have just switched from seeing/not seeing beacons: " + state);
}



public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    Log.d(TAG,"Now finding beacon range");

}

public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(this);
}}

Приведенный выше класс запускается с использованием:

 android:name=".whereismybag"

Полный манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.utsav.whereismybag">

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:name=".whereismybag"
    android:allowBackup="true"
    android:icon="@drawable/wimbicon"
    android:label="@string/app_name"
    android:roundIcon="@drawable/wimbicon"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <!-- android:name=".whereismybag" -->

    <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
        android:screenOrientation="portrait" />
    <activity
        android:name=".splashscreen"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".scanning"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".beaconfound"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".save"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".viewsaved"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".findingbags"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".bagfound"
        android:launchMode="singleTask"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".setrange"
        android:launchMode="singleInstance"
        android:parentActivityName=".MainActivity"
        android:screenOrientation="portrait" />
    <activity android:name=".beaconfoundlist"></activity>
</application>

This is the MainActivity:

public class MainActivity extends AppCompatActivity {
Button button;

/*SharedPreferences preferences = getApplicationContext().getSharedPreferences("com.utsav.whereismybag", 0);*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_ADMIN}, 1);
        }
        if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
        }
        if (checkSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, 1);
        }
    }

    boolean gps_enabled = false;
    boolean bluetoothadmin_enabled = false;
    //checking for active location
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try {
        gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
    }
    try {
        bluetoothadmin_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
    }
    if (!gps_enabled && !bluetoothadmin_enabled) {
        android.app.AlertDialog.Builder dialog = new android.app.AlertDialog.Builder(this);
        dialog.setMessage(getResources().getString(R.string.gps_network_not_enabled));
        dialog.setPositiveButton(getResources().getString(R.string.open_location_settings), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(myIntent);
            }
        });
        dialog.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                // TODO Auto-generated method stub

            }
        });
        dialog.show();
    }
    //checking for active bluetooth
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
        android.app.AlertDialog.Builder dialog = new android.app.AlertDialog.Builder(this);
        dialog.setMessage("This device does not support Bluetooth");
        // Device does not support Bluetooth
    } else {
        if (!mBluetoothAdapter.isEnabled()) {
            // Bluetooth is not enabled
            android.app.AlertDialog.Builder dialog = new android.app.AlertDialog.Builder(this);
            dialog.setMessage(getResources().getString(R.string.bluetooth_not_enabled));
            dialog.setPositiveButton(getResources().getString(R.string.open_bluetooth_settings), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    Intent myIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
                    startActivity(myIntent);
                }
            });
            dialog.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    // TODO Auto-generated method stub

                }
            });
            dialog.show();
        }
    }

    button = (Button) findViewById(R.id.setupbags);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent myIntent1 = new Intent(MainActivity.this,
                    scanning.class);
            startActivity(myIntent1);
        }
    });//Start scanning
    button = (Button) findViewById(R.id.savedbeac);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent myIntent1 = new Intent(MainActivity.this,
                    viewsaved.class);
            startActivity(myIntent1);
        }
    });//Start scanning
    button = (Button) findViewById(R.id.findbags);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent myIntent1 = new Intent(MainActivity.this,
                    findingbags.class);
            startActivity(myIntent1);
        }
    });//Start scanning
    button = (Button) findViewById(R.id.setrange);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent myIntent1 = new Intent(MainActivity.this,
                    setrange.class);
            startActivity(myIntent1);
        }
    });//Start scanning
}}

Вот журнал:

06-12 11:20:42.616 26716-26716/com.example.utsav.whereismybag D/.wherebg: 
Background scanning started up
06-12 11:20:42.624 26716-26716/com.example.utsav.whereismybag 
I/BeaconManager: BeaconManager started up on pid 26716 named 
'com.example.utsav.whereismybag' for application package 
'com.example.utsav.whereismybag'.  isMainProcess=true
06-12 11:20:42.629 26716-26716/com.example.utsav.whereismybag 
D/BeaconParser: Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-
23,p:24-24,d:25-25
06-12 11:20:42.635 26716-26716/com.example.utsav.whereismybag 
D/BeaconParser: Parsing beacon layout: s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-
13,i:14-19
06-12 11:20:42.790 26716-26753/com.example.utsav.whereismybag D/AppTracker: 
App Event: start
06-12 11:20:42.811 26716-26716/com.example.utsav.whereismybag 
W/BluetoothCrashResolver: Can't read macs from 
BluetoothCrashResolverState.txt
06-12 11:20:42.813 26716-26716/com.example.utsav.whereismybag 
I/CycledLeScanner: This Android 5.0.  We are using new scanning APIs
06-12 11:20:42.815 26716-26716/com.example.utsav.whereismybag 
I/BeaconService: beaconService version 2.11-beta1 is starting up on the main 
process
06-12 11:20:42.822 26716-26756/com.example.utsav.whereismybag 
I/DpmTcmClient: RegisterTcmMonitor from: 
com.android.okhttp.TcmIdleTimerMonitor
06-12 11:20:42.825 26716-26756/com.example.utsav.whereismybag 
D/NetworkSecurityConfig: No Network Security Config specified, using 
platform default
06-12 11:20:42.843 26716-26716/com.example.utsav.whereismybag 
W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
06-12 11:20:42.843 26716-26716/com.example.utsav.whereismybag 
W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
06-12 11:20:42.846 26716-26716/com.example.utsav.whereismybag I/BeaconService: starting with intent Intent { cmp=com.example.utsav.whereismybag/org.altbeacon.beacon.service.BeaconService }
06-12 11:20:42.846 26716-26716/com.example.utsav.whereismybag I/BeaconService: binding
06-12 11:20:42.857 26716-26754/com.example.utsav.whereismybag I/Adreno: QUALCOMM build                   : 853a1ff, I9c435c2712
                                                                    Build Date                       : 01/10/17
                                                                    OpenGL ES Shader Compiler Version: XE031.09.00.04
                                                                    Local Branch                     : 
                                                                    Remote Branch                    : 
                                                                    Remote Branch                    : 
                                                                    Reconstruct Branch               : 
06-12 11:20:42.861 26716-26754/com.example.utsav.whereismybag I/OpenGLRenderer: Initialized EGL, version 1.4
06-12 11:20:42.861 26716-26754/com.example.utsav.whereismybag D/OpenGLRenderer: Swap behavior 1
06-12 11:20:42.867 26716-26716/com.example.utsav.whereismybag D/.wherebg: I have just switched from seeing/not seeing beacons: 0
06-12 11:20:42.946 26716-26716/com.example.utsav.whereismybag I/BeaconService: start monitoring received
06-12 11:20:44.166 26716-26756/com.example.utsav.whereismybag I/ModelSpecificDistanceCalculator: Successfully saved new distance model file
06-12 11:20:44.167 26716-26756/com.example.utsav.whereismybag W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
06-12 11:20:44.167 26716-26756/com.example.utsav.whereismybag I/ModelSpecificDistanceCalculator: Successfully updated distance model with latest from online database
06-12 11:20:45.799 26716-26819/com.example.utsav.whereismybag D/AppTracker: App Event: stop
06-12 11:20:45.860 26716-26716/com.example.utsav.whereismybag I/BeaconService: set scan intervals received
06-12 11:20:45.991 26716-26716/com.example.utsav.whereismybag W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-12 11:20:46.021 26716-26716/com.example.utsav.whereismybag V/BoostFramework: mAcquireFunc method = public int com.qualcomm.qti.Performance.perfLockAcquire(int,int[])
06-12 11:20:46.021 26716-26716/com.example.utsav.whereismybag V/BoostFramework: mReleaseFunc method = public int com.qualcomm.qti.Performance.perfLockRelease()
06-12 11:20:46.021 26716-26716/com.example.utsav.whereismybag V/BoostFramework: mAcquireTouchFunc method = public int com.qualcomm.qti.Performance.perfLockAcquireTouch(android.view.MotionEvent,android.util.DisplayMetrics,int,int[])
06-12 11:20:46.021 26716-26716/com.example.utsav.whereismybag V/BoostFramework: mIOPStart method = public int com.qualcomm.qti.Performance.perfIOPrefetchStart(int,java.lang.String)
06-12 11:20:46.021 26716-26716/com.example.utsav.whereismybag V/BoostFramework: mIOPStop method = public int com.qualcomm.qti.Performance.perfIOPrefetchStop()
06-12 11:20:46.023 26716-26716/com.example.utsav.whereismybag V/BoostFramework: BoostFramework() : mPerf = com.qualcomm.qti.Performance@df677b
06-12 11:20:46.023 26716-26716/com.example.utsav.whereismybag V/BoostFramework: BoostFramework() : mPerf = com.qualcomm.qti.Performance@4c8b998
06-12 11:20:46.120 26716-26753/com.example.utsav.whereismybag D/AppTracker: App Event: start
06-12 11:20:46.124 26716-26756/com.example.utsav.whereismybag D/AppTracker: App Event: stop
06-12 11:20:46.137 26716-26716/com.example.utsav.whereismybag I/BeaconService: set scan intervals received
06-12 11:20:46.149 26716-26716/com.example.utsav.whereismybag I/CycledLeScanner: Adjusted scanStopTime to be 885106541
06-12 11:20:46.215 26716-26716/com.example.utsav.whereismybag I/BeaconService: set scan intervals received
06-12 11:20:46.238 26716-26716/com.example.utsav.whereismybag W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
06-12 11:20:46.314 26716-26755/com.example.utsav.whereismybag D/BluetoothAdapter: STATE_ON
06-12 11:20:46.314 26716-26755/com.example.utsav.whereismybag D/BluetoothLeScanner: could not find callback wrapper
06-12 11:20:46.318 26716-26755/com.example.utsav.whereismybag D/BluetoothAdapter: STATE_ON
06-12 11:20:46.327 26716-26729/com.example.utsav.whereismybag D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 mClientIf=0
06-12 11:20:46.335 26716-26729/com.example.utsav.whereismybag W/Binder: Binder call failed.
                                                                    java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
                                                                        at android.os.Parcel.readException(Parcel.java:1684)
                                                                        at android.os.Parcel.readException(Parcel.java:1637)
                                                                        at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:678)
                                                                        at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:367)
                                                                        at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56)
                                                                        at android.os.Binder.execTransact(Binder.java:580)
06-12 11:20:48.328 26716-26755/com.example.utsav.whereismybag D/BluetoothAdapter: STATE_ON
06-12 11:20:50.089 26716-26819/com.example.utsav.whereismybag D/AppTracker: App Event: start
06-12 11:20:50.096 26716-26716/com.example.utsav.whereismybag I/BeaconService: set scan intervals received
06-12 11:20:50.102 26716-26716/com.example.utsav.whereismybag I/CycledLeScanner: Adjusted scanStopTime to be 885111115
06-12 11:20:50.555 26716-26755/com.example.utsav.whereismybag D/BluetoothAdapter: STATE_ON
06-12 11:20:50.560 26716-26728/com.example.utsav.whereismybag D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 mClientIf=0
06-12 11:20:50.938 26716-26973/com.example.utsav.whereismybag D/.wherebg: I have just switched from seeing/not seeing beacons: 1
06-12 11:20:50.938 26716-26973/com.example.utsav.whereismybag D/.wherebg: Got a didEnterRegion call
06-12 11:20:50.959 26716-26716/com.example.utsav.whereismybag I/BeaconService: stop monitoring received

                                                                           --------- beginning of crash
06-12 11:20:50.963 26716-26973/com.example.utsav.whereismybag E/AndroidRuntime: FATAL EXCEPTION: IntentService[BeaconIntentProcessor]
                                                                            Process: com.example.utsav.whereismybag, PID: 26716
                                                                            java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.startRangingBeaconsInRegion(org.altbeacon.beacon.Region)' on a null object reference
                                                                                at com.example.utsav.whereismybag.whereismybag.didEnterRegion(whereismybag.java:91)
                                                                                at org.altbeacon.beacon.BeaconIntentProcessor.onHandleIntent(BeaconIntentProcessor.java:99)
                                                                                at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:154)
                                                                                at android.os.HandlerThread.run(HandlerThread.java:61)
06-12 11:20:50.963 26716-26973/com.example.utsav.whereismybag D/AppTracker: App Event: crash
06-12 11:20:50.967 26716-26716/com.example.utsav.whereismybag I/BeaconService: unbinding
06-12 11:20:50.967 26716-26716/com.example.utsav.whereismybag E/BeaconService: onDestroy()
06-12 11:20:50.967 26716-26755/com.example.utsav.whereismybag D/BluetoothAdapter: STATE_ON
06-12 11:20:50.969 26716-26716/com.example.utsav.whereismybag I/BeaconService: onDestroy called.  stopping scanning
06-12 11:20:50.980 26716-26753/com.example.utsav.whereismybag D/AppTracker: App Event: stop
06-12 11:20:50.981 26716-26716/com.example.utsav.whereismybag E/BeaconManager: Cannot contact service to set scan periods
06-12 11:20:50.984 26716-26753/com.example.utsav.whereismybag E/DeviceManagerUtil: RunningAppProcessInfo is null
06-12 11:20:50.986 26716-26973/com.example.utsav.whereismybag I/Process: Sending signal. PID: 26716 SIG: 9

person uns    schedule 12.06.2017    source источник
comment
ты можешь опубликовать журнал кота?   -  person Muhammad Younas    schedule 12.06.2017
comment
Я добавил логи. @MuhammadYounas   -  person uns    schedule 12.06.2017
comment
на какой версии вы тестируете   -  person Muhammad Younas    schedule 12.06.2017
comment
API 25 (7.1.1) @MuhammadYounas   -  person uns    schedule 12.06.2017
comment
чем вам не хватает разрешения служб определения местоположения   -  person Muhammad Younas    schedule 12.06.2017
comment
Сбой происходит из-за того, что экземпляр beaconManager в whereismybag каким-то образом является нулевым. Вы можете увидеть это здесь: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.startRangingBeaconsInRegion(org.altbeacon.beacon.Region)' on a null object reference at com.example.utsav.whereismybag.whereismybag.didEnterRegion(whereismybag.java:91). Есть ли другой не показанный код, который может переназначить нулевое значение этой переменной?   -  person davidgyoung    schedule 12.06.2017
comment
Кажется, я не могу найти ничего, что вызывает это. Если я удалю android:name=".whereismybag", приложение начнет нормально работать без фонового сканирования. Кроме того, иногда он может немного поработать перед сбоем, но он выйдет из строя независимо от того, в какой активности он сейчас находится. @Davidgyoung   -  person uns    schedule 13.06.2017
comment
Странный. Я не понимаю, как эта переменная может стать нулевой. Вы можете повторно инициализировать его в этом методе с помощью beaconManager = BeaconManager.getInstanceForApplication(this);, но в этом нет необходимости.   -  person davidgyoung    schedule 13.06.2017
comment
Еще одна вещь, которую вы можете попробовать, - это протестировать с версией библиотеки 2.10 или 2.9 и посмотреть, есть ли у вас такая же проблема. Если нет, это может означать, что это изменение, внесенное в бета-версию 2.11.   -  person davidgyoung    schedule 13.06.2017


Ответы (1)


Из журнала отображается ошибка ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION

06-12 11: 20: 46.335 26716-26729 / com.example.utsav.whereismybag W / Binder: вызов связующего не удался. java.lang.SecurityException: требуется разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION для получения результатов сканирования на android.os.Parcel.readException (Parcel.java:1684) на android.os.Parcel.readException (Parcel.java:1637) на android.bluetooth. IBluetoothGatt $ Stub $ Proxy.startScan (IBluetoothGatt.java:678) по адресу android.bluetooth.le.BluetoothLeScanner $ BleScanCallbackWrapper.onClientRegistered (BluetoothLeScanner.java:367) по адресу android.bluetooth.IBluetoothGattCallbackGattCallback $ (IBluetooth). в android.os.Binder.execTransact (Binder.j ava: 580)

Чтобы получить разрешение, вы должны использовать приведенный ниже код

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/> 


if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED &&
        ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED) {
     // {beacon code}
} else {
    ActivityCompat.requestPermissions(this, new String[] {
      Manifest.permission.ACCESS_FINE_LOCATION, 
      Manifest.permission.ACCESS_COARSE_LOCATION }, 
      TAG_CODE_PERMISSION_LOCATION);
}

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case TAG_CODE_PERMISSION_LOCATION: {
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // {beacon code}
                }
            }
        }
    }
person Muhammad Younas    schedule 12.06.2017
comment
Я не думаю, что могу запрашивать разрешения, поскольку фоновый код не используется. Это класс. Я прошу разрешений на основные и все другие действия. Моя проблема в том, что если я включу этот код фонового сканирования в приложение, это приведет к сбою процесса переднего плана. В противном случае процесс переднего плана работает нормально без фонового сканирования. - person uns; 12.06.2017