代码之家  ›  专栏  ›  技术社区  ›  Kibi

这里将android sdk调用映射到positioningManager start方法返回false

  •  1
  • Kibi  · 技术社区  · 6 年前

    我读过 this question 尝试了它的答案,但它对我不起作用。

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

    <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>
    

    我应该说清楚我加了东西,但是行

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

    从“服务”一词开始在Android Studio中以红色显示(尽管所有代码都是编译的,但我假设有问题)

    这是我的主要活动

    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,当然地理位置总是空的。已授予所有权限,并且所有GPS等都已在电话上打开。

    也许这很简单,但有人能看到遗漏了什么吗?-我只想让我的应用程序每分钟检查一次位置。这个代码不适用于免费增值模式吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Kibi    6 年前

    根据@here developer support的建议,我得到了这个示例working=代码更改如下:

    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();
    }
    

    现在我收到这样的日志:

    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
    

    我不知道我缺少了什么权限,但这似乎无关紧要,因为代码现在可以工作了…不幸的是,它在我更复杂的应用程序中不起作用。提到了更复杂的应用程序 here

        2
  •  0
  •   HERE Developer Support    6 年前

    看来你在他的帮助下解决了他的问题 here-maps-android-sdk-call-to-positioningmanager-start-method-returns-false 但仍然存在问题 problems-using-here-api-to-get-my-position-wifi-updated

    要正确初始化映射引擎,需要授予以下权限:

    Manifest.permission.ACCESS_NETWORK_STATE
    Manifest.permission.ACCESS_WIFI_STATE
    Manifest.permission.INTERNET
    

    缺少授予其中一个权限将导致日志中缺少权限错误(我在第一个SO链接中看到)。 关于定位,建议同时授予权限-访问“精细”位置(允许应用程序访问精确位置)和访问“粗糙”位置(允许应用程序访问近似位置)。

    请看一下这些建议,让我们知道这个问题是否解决了。谢谢您!