2017-02-13 4 views
0

Ich versuche, in meiner Anwendung eine Schaltfläche zu aktivieren, die die Breite und Länge des Geräts erfasst, wenn der Benutzer darauf klickt. Der Button funktioniert einwandfrei, ruft aber nicht die Klassenmethode aus meiner GPSHelper-Klasse auf. Jede Hilfe mit diesem würde geschätzt werden. Ich teste und probiere dies auf meinem tatsächlichen Gerät und nicht ein Emulator, wenn das hilft. Danke für jede Hilfe.Ich kann den aktuellen Standort nicht über GPS mit GoogleApiClient abrufen

Hier ist meine GPSHelper-Klasse, wo ich alle Berechtigungen Checks und Code für die GPS-Nutzung platzieren.

import android.Manifest; 
import android.app.Activity; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.widget.Toast; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationServices; 


/** 
* This class takes care of capturing the location of the device. 
*/ 

public class GPSHelper extends Service implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, ActivityCompat.OnRequestPermissionsResultCallback{ 

    private final Context mContext; 
    boolean isGpsEnabled = false; 
    private Location mLastLocation; 
    private GoogleApiClient mGoogleApiClient; 
    double mLatitude; 
    double mLongitude; 

    public GPSHelper(Context context) { 
     this.mContext = context; 
    } 

    public Location getLocation() { 
     mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
       .addConnectionCallbacks(this).addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API).build(); 
     mGoogleApiClient.connect(); 
     isGpsEnabled = mGoogleApiClient.isConnected(); 

     if (isGpsEnabled){ 
      mLatitude = mLastLocation.getLatitude(); 
      mLongitude = mLastLocation.getLongitude(); 
      Toast.makeText(this, String.valueOf(mLatitude), Toast.LENGTH_LONG).show(); 
      Toast.makeText(this, String.valueOf(mLongitude), Toast.LENGTH_LONG).show(); 
      mGoogleApiClient.disconnect(); 
     } 

     return mLastLocation; 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions((Activity) this.mContext,new String[]{Manifest.permission.ACCESS_FINE_LOCATION, 
       Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.INTERNET}, 10); 
      } 
     } else { 
      if (mLastLocation == null){ 
       mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       getLocation(); 
      }else { 
       getLocation(); 
      } 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode){ 
      case 10: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        getLocation(); 
       }else { 
        Toast.makeText(this, "Action Canceled\nGPS Is Required",Toast.LENGTH_LONG).show(); 
       } 
       break; 
      default: 
       break; 
     } 

    } 

    public void onConnectionSuspended(int i) { 

    } 

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

    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

Hier ist die Aktivität, wo ich mit einer Instanz der Klasse GPSHelper die getLocation() Klasse Methode aufrufen versuche.

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.Toast; 

import com.example.bigdaddy.as_built_weldmapper.utilities.BendHelper; 
import com.example.bigdaddy.as_built_weldmapper.utilities.GPSHelper; 

public class SagActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, 
     MajorButtonFragment.OnFragmentInteractionListener, Communicator{ 

    /* Using this to insert into the Bend Direction field. */ 
    public static String SAG_DIRECTION = "SAG"; 

    /* This spinner holds the bend types */ 
    Spinner mSagBendTypesSpinner; 

    /* Using this string to collect what was selected for the spinner type */ 
    private String mBendTypeSpinnerVal; 

    /* All the EditText for the Activity */ 
    private EditText mSagGpsShotEt; 
    private EditText mSagExistingGpsEt; 
    private EditText mSagCoverEt; 
    private EditText mSagDegreeEt; 
    private EditText mSagDistanceFromEt; 
    private EditText mSagNotesEt; 
    private EditText mSagOccupyIdEt; 
    private EditText mSagStationNumEt; 

    public GPSHelper mGPSHelper; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sag); 
     mGPSHelper = new GPSHelper(SagActivity.this); 

     /* checking if the MajorButtonFragment is null */ 
     if (findViewById(R.id.majorButtonFragment) != null) { 
      if (savedInstanceState != null) { 
       return; 
      } 
     } 

     /* Referencing the spinner and setting the itemsSelectedListener */ 
     mSagBendTypesSpinner = (Spinner) findViewById(R.id.bend_types_spinner); 
     mSagBendTypesSpinner.setOnItemSelectedListener((AdapterView.OnItemSelectedListener) this); 
     /* Create an ArrayAdapter using the string array and a default spinner layout */ 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.bend_types_array, android.R.layout.simple_spinner_item); 
     /* Specify the layout to use when the list of choices appears */ 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     /* Apply the adapter to the spinner */ 
     mSagBendTypesSpinner.setAdapter(adapter); 

     /* Referencing and calling all the EditText for the Activity */ 
     mSagGpsShotEt = (EditText) findViewById(R.id.eTextGpsShotForSag); 
     mSagExistingGpsEt = (EditText) findViewById(R.id.eTextExistGradeForSag); 
     mSagCoverEt = (EditText) findViewById(R.id.eTextCoverForSag); 
     mSagDegreeEt = (EditText) findViewById(R.id.eTextDegreeForSag); 
     mSagDistanceFromEt = (EditText) findViewById(R.id.eTextDistanceFromForSag); 
     mSagNotesEt = (EditText) findViewById(R.id.eTextNotesForSagActivity); 
     mSagOccupyIdEt = (EditText) findViewById(R.id.eTextJointIdSagActivity); 
     mSagStationNumEt = (EditText) findViewById(R.id.eTextStationNumSagActivity); 
    } /*onCreate() ends here.*/ 

    @Override 
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
     mBendTypeSpinnerVal = mSagBendTypesSpinner.getSelectedItem().toString(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> adapterView) { 

    } 

    @Override 
    public void exitBtnRespond() { 

    } 

    /** 
    * This overridden method comes from the Communicator Interface and is used globally in all 
    * Activities that implement it to Store (write) a transaction to the database. 
    * The utility class saveAndInsertBend() method is invoked here. 
    */ 
    @Override 
    public void storeBtnRespond() { 
     BendHelper.saveAndInsertBend(SagActivity.this, SAG_DIRECTION, mBendTypeSpinnerVal, mSagStationNumEt, 
       mSagOccupyIdEt, mSagDegreeEt, mSagDistanceFromEt, mSagGpsShotEt, mSagExistingGpsEt, 
       mSagCoverEt, mSagNotesEt); 
    } 

    @Override 
    public void mapItBtnRespond() { 
     Toast.makeText(this, "MapItBtn clicked in SagActivity",Toast.LENGTH_LONG).show(); 
     mGPSHelper.getLocation(); 

    } 

    @Override 
    public void onFragmentInteraction() { 

    } 

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

Verfahren überschreiben mapItBtnRespond() stammt aus einer Fragment Klasse habe ich, dass meine Tasten enthält und es funktioniert. Die Nachricht Toast wird jedes Mal angezeigt, wenn ich auf die Schaltfläche klicke, aber es werden keine Berechtigungen für nichts angefordert. Wohin gehe ich bei all dem falsch?

Auch hier ist die Manifest Datei mit den Berechtigungen drin.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.bigdaddy.as_built_weldmapper"> 

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> 
     <!--android:theme="@style/AppTheme"> '--> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity android:name=".WeldActivity"> 
     </activity> 
     <activity android:name=".SagActivity"> 
     </activity> 
     <activity android:name=".OverbendActivity"> 
     </activity> 
     <activity android:name=".LtPiActivity"> 
     </activity> 
     <activity android:name=".RtPiActivity"> 
     </activity> 
     <activity android:name=".CmboObRtActivity"> 
     </activity> 
     <activity android:name=".ComboObLtActivity"> 
     </activity> 
     <activity android:name=".ComboSagRtActivity"> 
     </activity> 
     <activity android:name=".ComboSagLtActivity"> 
     </activity> 

    </application> 

</manifest> 

Vielen Dank für jede Hilfe. Diese

Antwort

0

ist, wie ich bin weiterhin Standortaktualisierungen immer

MyLocation.java

import android.Manifest; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 

import java.util.Timer; 
import java.util.TimerTask; 

/** 
    * Created by Rana Shahzaib on 1/9/2017. 
    */ 

public class MyLocation { 
Context context; 

MyLocation(Context context) { 
    this.context = context; 
} 

Timer timer1; 
LocationManager lm; 
LocationResult locationResult; 
boolean gps_enabled = false; 
boolean network_enabled = false; 

public boolean getLocation(Context context, LocationResult result) { 
    //I use LocationResult callback class to pass location value from MyLocation to user code. 
    locationResult = result; 
    if (lm == null) 
     lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    //exceptions will be thrown if provider is not permitted. 
    try { 
     gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    } catch (Exception ex) { 
    } 
    try { 
     network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch (Exception ex) { 
    } 

    //Toast.makeText(context, gps_enabled+" "+network_enabled,  Toast.LENGTH_LONG).show(); 

    //don't start listeners if no provider is enabled 
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    } 
    if (!gps_enabled && !network_enabled) 
     return false; 
    if (gps_enabled) 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
    if (network_enabled) 
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
    timer1 = new Timer(); 


    timer1.schedule(new GetLastLocation(), 10000); 
    return true; 
} 

LocationListener locationListenerGps = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     timer1.cancel(); 
     locationResult.gotLocation(location); 
    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
}; 

LocationListener locationListenerNetwork = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     timer1.cancel(); 
     locationResult.gotLocation(location); 
    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
}; 

class GetLastLocation extends TimerTask { 
    @Override 

    public void run() { 

     //Context context = getClass().getgetApplicationContext(); 
     Location net_loc = null, gps_loc = null; 
     if (gps_enabled) 
      if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       return; 
      } 
     gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if(network_enabled) 
      net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

     //if there are both values use the latest one 
     if(gps_loc!=null && net_loc!=null){ 
      if(gps_loc.getTime()>net_loc.getTime()) 
       locationResult.gotLocation(gps_loc); 
      else 
       locationResult.gotLocation(net_loc); 
      return; 
     } 

     if(gps_loc!=null){ 
      locationResult.gotLocation(gps_loc); 
      return; 
     } 
     if(net_loc!=null){ 
      locationResult.gotLocation(net_loc); 
      return; 
     } 
     locationResult.gotLocation(null); 
    } 
} 

public static abstract class LocationResult{ 
    public abstract void gotLocation(Location location); 
}} 

und hier bin ich immer Standort

MyLocation mLocation = new MyLocation(this); 
mLocation.getLocation(this, new MyLocation.LocationResult() { 

    @Override 
    public void gotLocation(Location location) { 
     //Your Logic 
    } 
}); 
Verwandte Themen