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