Java 应用程序在本地化期间进入循环

Java 应用程序在本地化期间进入循环,java,android,android-studio,Java,Android,Android Studio,我认为我的应用程序进入了循环,因为一旦它在设备中启动,它不会响应任何命令,包括按下按钮。我认为问题在于运行时许可证的方法。我为我的英语感到抱歉。 我的代码是: 公共类MainActivity扩展AppCompativeActivity实现GoogleAppClient.ConnectionCallbacks、GoogleAppClient.OnConnectionFailedListener{ private static final int REQUEST_RESOLVE_ERROR = 3;

我认为我的应用程序进入了循环,因为一旦它在设备中启动,它不会响应任何命令,包括按下按钮。我认为问题在于运行时许可证的方法。我为我的英语感到抱歉。 我的代码是:

公共类MainActivity扩展AppCompativeActivity实现GoogleAppClient.ConnectionCallbacks、GoogleAppClient.OnConnectionFailedListener{

private static final int REQUEST_RESOLVE_ERROR = 3;
private GoogleApiClient mGoogleApiClient;
private volatile Location mCurrentLocation;
private static final int REQUEST_PERMISSION_LOCATE = 2;
private static final int LOCATION_DURATE_TIME = 5000;
private boolean mResolvingError = false;


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

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(MainActivity.this, "ciao", Toast.LENGTH_LONG).show();
        }
    });

}

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
    Toast.makeText(MainActivity.this, "connesso", Toast.LENGTH_LONG).show();
}

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

@Override
public void onConnected(@Nullable Bundle bundle) {
    manageLocationPermission();
}

@Override
public void onConnectionSuspended(int i) {

}

//gestione dell'errore
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult)
{
    if (mResolvingError) {
        // If we're already managing an error we skip the invocation of this method
        return;
    } else if (connectionResult.hasResolution()) {
        // Here we check if the ConnectionResult has already the solution. If it has
        // we start the resolution process
        try {
            // Starting resolution
            mResolvingError = true;
            // We launch the Intent using a request id
            connectionResult.startResolutionForResult(MainActivity.this, REQUEST_RESOLVE_ERROR);
        } catch (IntentSender.SendIntentException e) {
            // If we have an error during resolution we can start again.
            mGoogleApiClient.connect();
        }
    } else {
        // The ConnectionResult in the worse case has the error code we have to manage
        // into a Dialog
        // Starting resolution
        mResolvingError = true;
    }
}



//location update
private void updateLocation()
{
    LocationRequest locationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setNumUpdates(1)
            .setExpirationDuration(LOCATION_DURATE_TIME);


    LocationServices.FusedLocationApi
            .requestLocationUpdates(mGoogleApiClient, locationRequest, new LocationListener() {
                @Override
                public void onLocationChanged(Location location)
                {
                    mCurrentLocation = location;
                }
            });
}

private void startLocationListener()
{
    updateLocation();
}


//permessi in RunTime
private void manageLocationPermission()
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED)
    {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION))
        {
            new AlertDialog.Builder(this)
                    .setTitle("Permesso di geolocalizzazione")
                    .setMessage("Devi dare il permesso alla geolocalizzazione")
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_LOCATE);
                        }
                    })
                    .create()
                    .show();
        }
        else {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_LOCATE);
        }
    }else
    {
        mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        manageLocationPermission();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if(requestCode == REQUEST_PERMISSION_LOCATE)
    {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            //se mi hanno accettato i permessi
            startLocationListener();
        }
        else{
            new AlertDialog.Builder(this)
                    .setTitle("Permesso di geolocalizzazione")
                    .setMessage("Devi dare il permesso alla geolocalizzazione")
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .create()
                    .show();
        }
    }
}

}

如果在已授予权限的情况下调用manageLocationPermission(),则代码将输入以下else子句

} else {
    mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    manageLocationPermission();
}

在这里,您再次调用同一个函数,由于已授予权限,您将输入相同的else子句,然后再次输入相同的内容。。。你看到了吗?如果您经常在
onConnectionFailed
中输入catch语句,则只需从else子句中删除
manageLocationPermission()
,这可能是无限循环。你能调试/记录并查看你的代码是否一次又一次地输入该代码吗?我尝试了对代码的注释,发现问题是运行时的权限代码,但我不明白是什么…你运行的是什么android版本?android 7.1.1-API 25我想我看到了导致无限循环的原因,检查我的答案below@MattDeveloper确保你接受解决问题的答案
} else {
    mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    manageLocationPermission();
}