【问题标题】:Failing to override onRequestPermissionsResult function despite it being an abstract method under superClass android.support.v4.app.ActivityCompat尽管它是超类 android.support.v4.app.ActivityCompat 下的抽象方法,但无法覆盖 onRequestPermissionsResult 函数
【发布时间】:2017-02-17 15:58:21
【问题描述】:

正如标题所示,我试图覆盖onRequestPermissionsResult 抽象方法,但Gradle 说该方法没有超类。

根据the documentation,超类是我导入的ActivityCompat。

我正在为基于位置的应用程序创建一个位置对象。

我该如何解决这个问题?

下面的代码sn-p

import android.*;
import android.Manifest;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;


import android.app.Activity;
import android.app.PendingIntent;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.Geofence;
import com.google.android.gms.location.GeofencingApi;
import com.google.android.gms.location.GeofencingRequest;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsResult;

import android.content.ContextWrapper;
import android.content.Context;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.content.ContextCompat;
import android.util.Log;

/**
 * Created by User on 7/2/2016.
 */
public class GoogleLocationHandler implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener{

    public GoogleApiClient mGoogleApiClient;

    public static final String TAG = GoogleLocationHandler.class.getSimpleName();

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private final static int MY_PERMISSION_ACCESS_FINE_LOCATION = 1;

    private static Context parentBase;
    private static Activity parentActivity;
    private static PendingIntent parentIntent;
    public Location phoneLocation;

    private LocationRequest requestLocation;



    public GoogleLocationHandler(Context Base, Activity activityBase, PendingIntent intent){
        parentBase = Base;
        parentActivity = activityBase;
        parentIntent = intent;
        initialLocationService(parentBase);
    }

     public void initialLocationService(Context Base)
    {
       mGoogleApiClient = new GoogleApiClient.Builder(Base)
                           .addConnectionCallbacks(this)
                           .addOnConnectionFailedListener(this)
                           .addApi(LocationServices.API)
                           .build();

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

    }

    public void connect()
    {
        mGoogleApiClient.connect();

    }

    public void pause (){
        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, parentIntent);
            mGoogleApiClient.disconnect();
        }

    }

    public void disconnect()
    {
        if (mGoogleApiClient.isConnected())
        {
            mGoogleApiClient.disconnect();
        }
    }

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

        if(PackageManager.PERMISSION_GRANTED ==
                (ContextCompat.checkSelfPermission(parentBase, Manifest.permission.ACCESS_FINE_LOCATION)))

        {
            phoneLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

            if (phoneLocation == null) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, requestLocation, parentIntent);
            } else {
                Log.d(TAG, phoneLocation.toString());
            }
        }
        else
        {
            ActivityCompat.requestPermissions(parentActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_ACCESS_FINE_LOCATION);
        }

    }




    //public void onRequestPermissionsResult(int requestCode,
    //                                       String permissions[], int[] grantResults)

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

    {
        switch(requestCode)
        {
            case MY_PERMISSION_ACCESS_FINE_LOCATION:{
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    if(PackageManager.PERMISSION_GRANTED ==
                            (ContextCompat.checkSelfPermission(parentBase, Manifest.permission.ACCESS_FINE_LOCATION)))

                    {
                        phoneLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

                        if (phoneLocation == null) {
                            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, requestLocation, parentIntent);
                        } else {
                            Log.d(TAG, phoneLocation.toString());
                        }
                    }
                    else
                    {
                        ActivityCompat.requestPermissions(parentActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                MY_PERMISSION_ACCESS_FINE_LOCATION);
                    }

                }
            }
        }
}

【问题讨论】:

    标签: java android inheritance android-gradle-plugin superclass


    【解决方案1】:

    您的自定义类 GoogleLocationHandler 没有实现 ActivityCompat.OnRequestPermissionsResultCallback,因此它没有要覆盖的 onRequestPermissionsResult。

    当您调用ActivityCompat.requestPermissions 时,是parentActivity 接收到onRequestPermissionsResult 的回调,它不会自动调用您GoogleLocationHandler 中的任何方法。您需要手动将 Activity 的 onRequestPermissionsResult 中的信息传递给您的 GoogleLocationHandler。

    【讨论】:

    • 啊哈。非常感谢。感觉有点失望,我没有注意到超类是一个接口。
    猜你喜欢
    • 2016-01-02
    • 2013-09-19
    • 2013-09-12
    • 2014-01-16
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多