2016-10-08 6 views
1

제목에서 알 수 있듯이 onRequestPermissionsResult 추상 메서드를 재정의하려고하는데 Gradle은 메서드에 대한 수퍼 클래스가 없다고 말합니다. .superClass에서 abstract 메서드인데도 불구하고 onRequestPermissionsResult 함수를 재정의하지 못했습니다. android.support.v4.app.ActivityCompat

the documentation에 따르면 수퍼 클래스는 내가 가져온 ActivityCompat입니다.

위치 기반 앱용 위치 개체를 만들고 있습니다.

어떻게이 문제를 해결할 수 있습니까? 이 오버라이드 (override)하는 onRequestPermissionsResult하지 않도록

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

       } 
      } 
     } 
} 

답변

2

사용자 정의 클래스 GoogleLocationHandler 아래

코드는, ActivityCompat.OnRequestPermissionsResultCallback를 구현하지 않습니다.

ActivityCompat.requestPermissions으로 전화 할 때 에 콜백을 수신하는 것은 parentActivity이며 GoogleLocationHandler에서 자동으로 메서드를 호출하지 않습니다. 활동의 onRequestPermissionsResult에서 GoogleLocationHandler으로 수동으로 정보를 전달해야합니다.

+0

AHA. 고마워. 조금 실망한 느낌으로 나는 수퍼 클래스가 인터페이스라는 것을 알지 못했다. – law