这里,将Android SDK的Maps调用到PositioningManager的start方法返回false [英] Here Maps Android SDK call to PositioningManager start method returns false

查看:28
本文介绍了这里,将Android SDK的Maps调用到PositioningManager的start方法返回false的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已阅读此问题,尝试了答案,但对我不起作用.

I've read this question and tried its answer and it doesn't work for me.

我做了一个非常简单的测试应用程序,这是清单:

I made a very simple test application, here's the manifest:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="22"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="com.here.android.maps.appid"
        android:value="itkC4uIay69MXXXXXXXX" />
    <meta-data
        android:name="com.here.android.maps.apptoken"
        android:value="NdT8laoCmRysyhXXXXXXXX" />

    <service
        android:enabled="true"
        android:exported="false"
        android:name="com.here.services.internal.LocationService"
        android:process=":remote">
    </service>

</application>

我应该明确说明我已经添加了内容,但是这一行

I should make clear that I added in the stuff, but the line

android:name="com.here.services.internal.LocationService"

在Android Studio中,从服务"一词开始以红色显示(尽管所有编译,但我都认为有问题)

Shows up in red from the word "services" onwards in Android Studio (although all compiles, I'm assuming there is something wrong)

这是我的MainActivity

Here's my MainActivity

package com.company.Application;

import android.Manifest;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.here.android.mpa.common.GeoCoordinate;
import com.here.android.mpa.common.GeoPosition;
import com.here.android.mpa.common.PositioningManager;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private static final String[] REQUIRED_SDK_PERMISSIONS = new String[] {
            Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE };

    // permissions request code
    private final static int REQUEST_CODE_ASK_PERMISSIONS = 9893;

    private Timer tickMinTimer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkPermissions();
    }

    private void setUpPositioning() {
        PositioningManager pm = PositioningManager.getInstance();
        PositioningManager.LocationStatus  ls = pm.getLocationStatus(PositioningManager.LocationMethod.GPS_NETWORK);
        Log.i("Position", "Setting up positioning");
        if (ls ==  PositioningManager.LocationStatus.AVAILABLE) {
            Log.i("Position", "Positioning is available");
        } else {
            Log.w("Position", "Positioning not available right now: " + ls.toString());
        }
        boolean ret = pm.start(PositioningManager.LocationMethod.GPS_NETWORK);
        Log.i("Position", "Positioning start returns " + ret);
        timerTickEveryMinute();
    }

    private void timerTickEveryMinute() {
        tickMinTimer = new Timer();
        tickMinTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                // going to try to get the location here - if not once a minute then once every x minutes
                GeoPosition pos = PositioningManager.getInstance().getPosition();
                if (pos == null) {
                    Log.w("Position", "GeoPosition is Null");
                } else {
                    GeoCoordinate coord = pos.getCoordinate();
                    Log.i("Position", "Location: Latitude = " + coord.getLatitude() + ", Longitude = " + coord.getLongitude());
                    Log.i("Position", "Accuracy = " + pos.getLatitudeAccuracy() + ", " + pos.getLongitudeAccuracy());
                }
            }
        }, 5000, 1000*60);
    }

    // check for permissions
    /**
     * Checks the dynamically controlled permissions and requests missing permissions from end user.
     */
    protected void checkPermissions() {
        final List<String> missingPermissions = new ArrayList<String>();
        // check all required dynamic permissions
        for (final String permission : REQUIRED_SDK_PERMISSIONS) {
            final int result = ContextCompat.checkSelfPermission(this, permission);
            if (result != PackageManager.PERMISSION_GRANTED) {
                missingPermissions.add(permission);
            }
        }
        if (!missingPermissions.isEmpty()) {
            // request all missing permissions
            final String[] permissions = missingPermissions
                    .toArray(new String[missingPermissions.size()]);
            ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_ASK_PERMISSIONS);
        } else {
            final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
            Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
            onRequestPermissionsResult(REQUEST_CODE_ASK_PERMISSIONS, REQUIRED_SDK_PERMISSIONS,
                    grantResults);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_PERMISSIONS:
                for (int index = permissions.length - 1; index >= 0; --index) {
                    if (grantResults[index] != PackageManager.PERMISSION_GRANTED) {
                        // exit the app if one permission is not granted
                        Toast.makeText(this, "Required permission '" + permissions[index]
                                + "' not granted, exiting", Toast.LENGTH_LONG).show();
                        finish();
                        return;
                    }
                }
                final List<String> missingPermissions = new ArrayList<String>();

                for (final String permission : REQUIRED_SDK_PERMISSIONS) {
                    final int result = ContextCompat.checkSelfPermission(this, permission);
                    if (result != PackageManager.PERMISSION_GRANTED) {
                        missingPermissions.add(permission);
                    }
                }
                if (missingPermissions.isEmpty()) {
                    // all permissions were granted
                    setUpPositioning();
                }
                break;
        }
    }

}

因此,pm.start()始终返回false,当然GeoPosition始终为null.已授予所有权限,并且已在手机上打开所有GPS等.

So, pm.start() always returns false and of course the GeoPosition is always null. All permissions have been granted, and all GPS etc is turned on on the phone.

也许这很简单,但是任何人都可以看到缺少的内容吗? -我要做的就是让我的应用每分钟检查一次位置.此代码不适用于免费增值模式吗?

Perhaps it's something simple, but can anyone see what is missing? - all I want is to make my app check the position once a minute. Does this code not work with the freemium model?

推荐答案

在@HERE开发人员支持的建议下,我使此示例正常工作=代码更改如下:

On advice from @HERE Developer Support, I have got this example working = the code is changed as follows:

private void setUpPositioning() {
    // new lines from HERE
    MapEngine.getInstance().init(this, new OnEngineInitListener() {
        @Override
        public void onEngineInitializationCompleted(Error error) {
            if (error == Error.NONE) {
                Log.i("Position", "correctly started map engine");
            } else {
                Log.i("Position", "Problem setting up map engine: " + error);
            }
        }
    });
    //end of lines from HERE
    PositioningManager pm = PositioningManager.getInstance();
    PositioningManager.LocationStatus  ls = pm.getLocationStatus(PositioningManager.LocationMethod.GPS_NETWORK);
    Log.i("Position", "Setting up positioning");
    if (ls ==  PositioningManager.LocationStatus.AVAILABLE) {
        Log.i("Position", "Positioning is available");
    } else {
        Log.w("Position", "Positioning not available right now: " + ls.toString());
    }
    boolean ret = pm.start(PositioningManager.LocationMethod.GPS_NETWORK);
    Log.i("Position", "Positioning start returns " + ret);
    timerTickEveryMinute();
}

现在我收到这样的日志:

Now I receive Logs like this:

2019-01-27 12:02:51.716 1790-1790/com.company.app I/Position: Setting up positioning
2019-01-27 12:02:51.716 1790-1790/com.company.app W/Position: Positioning not available right now: TEMPORARILY_UNAVAILABLE
2019-01-27 12:02:51.745 1790-1790/com.company.app I/Position: Positioning start returns true
2019-01-27 12:02:51.760 1790-1790/com.company.app I/Position: Problem setting up map engine: MISSING_PERMISSION
2019-01-27 12:02:56.749 1790-2674/com.company.app I/Position: Location: Latitude = 31.8051461, Longitude = 35.092536
2019-01-27 12:02:56.750 1790-2674/com.company.app I/Position: Accuracy = 19.71, 19.71

我不确定我缺少什么权限,但是这似乎无关紧要,因为代码现在可以正常工作了……不幸的是,它在我更复杂的应用程序中不起作用:-(.在此处

I'm not sure what permission I'm missing, but it doesn't seem to matter since the code now works... unfortunately, it is not working in my more complex app :-( . The more complex app is mentioned here

这篇关于这里,将Android SDK的Maps调用到PositioningManager的start方法返回false的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆