当前位置: 首页 > 知识库问答 >
问题:

客户端必须具有ACCESS_FINE_LOCATION权限才能请求priority_high_precision位置运行时错误

袁泰
2023-03-14
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

这是我的完整代码。

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,LocationListener {

private static final String TAG ="hello" ;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;


public Location mLastLocation=null;


public final int MY_PERMISSIONS_REQUEST_COARSE_LOCATION=0;

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

    if (mGoogleApiClient==null){
        mGoogleApiClient= new GoogleApiClient.Builder(this)

                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(10 * 100)        // 10 seconds, in milliseconds
            .setFastestInterval( 1* 100); // 1 second, in milliseconds

    }









@Override
public void onConnected(@Nullable Bundle bundle) {


    int permissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION);
    int permissionCheck1 = ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION);
    if (permissionCheck != PackageManager
            .PERMISSION_GRANTED && permissionCheck1 != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_COARSE_LOCATION);


        }
    }


    mLastLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        TextView mLatitudeText =(TextView)findViewById(R.id.textView);
        TextView mLongitudeText =(TextView)findViewById(R.id.textView2);

        mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
        mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));

        Log.i("Location Info", "Location achieved!");

    } else {



        Log.i("Location Info", "No location :(");

    }


    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);//error here!!






}



@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
protected void onResume() {
    mGoogleApiClient.connect();
    super.onResume();

}

@Override
protected void onPause() {
    mGoogleApiClient.disconnect();
    super.onPause();
}



@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case  MY_PERMISSIONS_REQUEST_COARSE_LOCATION :{
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Log.i("Message","Got full permission");



            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }



}


@Override
public void onLocationChanged(Location location)
{
    Log.i("Location Info", "Location is changed Bitchh :(");
    handleNewLocation(location);
}

private void handleNewLocation(Location location) {
    Log.d(TAG, location.toString());
}

}

此外,我已经在清单文件中给予了许可。

10-24 17:13:02.857 222 4-2379/com.example.ashutosh.location e/abstractTracker:无法在未调用looper.prepare()的线程内创建处理程序0-24 17:13:03.184 2222 4-2224/com.example.ashutosh.location e/androidruntime:致命异常:main process:com.example.ashutosh.location,pid:2224 java.lang.securityexception:Client必须具有ACCESS_FINE_LOCATION权限才能请求priority_high_precurity位置。在Android.os.parcel.ReadException(parcel.java:1620),在Android.os.parcel.ReadException(parcel.java:1573),在com.google.android.gms.internal.zzed.zzb(未知来源),在com.google.android.gms.internal.zzcd.zza(未知来源),在com.google.android.gms.internal.zzcd.zza(未知来源),在com.google.android.gms.internal.zzcd.zza(未知来源),在来源不明)在com.google.android.gms.internal.zzbca.zze(来源不明)在com.google.android.gms.internal.zzbcx.zze(来源不明)在com.google.android.gms.internal.zzbcx.zze(来源不明)在com.google.android.gms.internal.zzbcx.zze(来源不明)在com.google.android.gms.internal.zzbcx.zze(来源不明)在com.google.android.gms.internal.zzze((来源不明)com.google.android.gms.internal.zzbcd.zzpyrce)在com.google.android.gms.internal.zzbcd.onconnected(未知来源)在com.google.android.gms.internal.zzbcx.onconnected(未知来源)在com.google.android.gms.internal.zzbcx.onconnected(未知来源)在com.google.android.gms.internal.zzbbi.onconnected(未知来源)在com.google.android.gms.internal.zzbbi.onconnected(未知来源)在com.google.android.gms.common.internal.zzh.handleMessage(来源未知)位于Android.os.handler.dispatchMessage(handler.java:102),android.os.handler.dispatchMessage(handler.java:152),android.os.looper.loop(looper.java:152),android.app.activitythread.main(activitythread.java:5497),java.lang.reflect.Method.invoke(原生方法)

共有1个答案

鲁滨海
2023-03-14

RequestPermissions()是异步的。当它返回时,您还没有权限。用户甚至没有被询问权限。

您需要在两个地方执行位置逻辑:

>

  • 先行,如果您已经有权限

  •  类似资料:
    • 我做错了什么?

    • 我尝试运行,但它提出了以下错误“必须有Java运行时环境JRE或Java开发工具包才能运行Eclipse。在folloiwng位置搜索后没有找到Java虚拟机.......”。 请记住,我在上安装了Java jre7和Java JDK1.7.0_06 另外一件奇怪的事情是,昨天Eclipse运行时没有任何问题,但今天我下载了JDK1.7.0_06,并将JAVA_HOME设置为“C:\Program

    • 啊,我的模拟器里有位置。

    • 同步-向API发出一批请求,并定期将响应保存到我的数据库。 客户端-从我的客户端的用户向API请求的传递。 服务的文档指定了在给定时间段内可以发出的最大请求数的以下规则: 在一天中: null null 超过这些限制不会导致立即锁定-不会抛出任何异常。但供应商可能会感到恼火,联系我们,然后禁止我们使用他的服务。因此,我需要有一些请求延迟机制,在适当的地方,以防止这一点。我是这样看的: 最安全和最简

    • 首先,我知道这是一个重复的问题,但我已经看过了其他类似问题的答案,没有找到成功的解决方案。 我已经开发了一款应用程序,可以在我的测试设备上完美运行,这是一款运行Android L(5.0.1)的三星S4。不过,我希望这款应用程序也能在较新版本的Android上运行。 我知道Android M的请求权限已更改,因此必须在运行时请求权限,但当我尝试实现此功能时,对话框从未出现,因此从未请求所需的权限。

    • 我想检查一个特定的应用程序是否需要在运行时处理Android Marshmallow运行时权限。 以下假设正确吗? 下面是我详细阐述的表格,例如,向具有Android Marshmallow运行时权限的用户请求权限时,需要使用权限。 我知道支持库助手的存在,但我想在这种特殊情况下避免使用它们。