java कोड केवल NullPointerException को फेंकते समय 0.0, 0.0 GPS समन्वय करेगा



android (1)

यह एंड्रॉइड लोकेशन एपीआई के साथ मेरा n-वें प्रयास है, और मैं इसे ठीक से काम करने के लिए प्राप्त नहीं कर सकता। यह ट्यूटोरियल सबसे अधिक आशाजनक लगता है, लेकिन मैं केवल 0.0, 0.0 का एक जीपीएस समन्वय वापस करने के लिए इस कोड को प्राप्त कर सकता हूं - जो बहुत उपयोगी है ...

उस getLocation में एक सुराग प्रतीत होता है () एक java.lang.NullPointerException त्रुटि देता है, लेकिन मुझे यकीन नहीं है कि जहां मुझे इसकी तलाश शुरू करनी चाहिए।

यहाँ त्रुटि है:

 W/System.err: java.lang.NullPointerException
 W/System.err:     at android.content.ContextWrapper.checkPermission(ContextWrapper.java:557)

मैंने नीचे एक नया पेस्ट ब्लॉक बनाने की कोशिश की, लेकिन यह ठीक वैसा ही था।

क्या कोई मुझे यहाँ सही दिशा में इंगित कर सकता है?

कोड दो वर्ग-फाइलों पर विभाजित है: MainActivity.java और GPSTracker.java।

GPSTracker.java

    package com.tutorial.android.location.api;

// http://www.androidhive.xyz/2016/07/android-gps-location-manager-tutorial.html
// with some modifications, especially for new permissions

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {
    private String TAG = "¤¤";
    private final Context mContext;

    public GPSTracker(Context mContext) {
        this.mContext = mContext;
        this.getLocation();
    }

    boolean isGPSEnabled = false;
    boolean isNetworkEnabled = false;
    boolean canGetLocation = false;

    Location location;
    double latitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATE = 10; // 10 meters
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 30 sec

    protected LocationManager locationManager;

    public Location getLocation() {
        try {

            if(locationManager == null) {
                locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
            }
            if(isGPSEnabled != true) {
                isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            }
            if(isNetworkEnabled != true) {
                isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            }

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no provider enabled :p
                Log.e(TAG, "getLocation() no provider :(");
            } else {
                this.canGetLocation = true;
                // get network location
                if (isNetworkEnabled) {
                    // permission block:
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        // TODO: Consider calling
                        //    ActivityCompat#requestPermissions
                        // here to request the missing permissions, and then overriding
                        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                        //                                          int[] grantResults)
                        // to handle the case where the user grants the permission. See the documentation
                        // for ActivityCompat#requestPermissions for more details.
                        // return TODO;
                    } else {
                        Log.e(TAG, "getLocation() permission DENIED");
                    }
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATE, this);
                    if(locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // get GPS location
                if(isGPSEnabled) {
                    if(location == null) {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATE, this);
                        Log.d(TAG, "getLocation() GPS Enabled");
                        if(locationManager != null){
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if(location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "getLocation() ERROR...: " + e);
            e.printStackTrace();
        }
        return location;
    }

    public double getLatitude() {
        if(location != null) {
            latitude = location.getLatitude();
        }
        return latitude;
    }

    public double getLongitude() {
        if(location != null) {
            longitude = location.getLongitude();
        }
        return longitude;
    }

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

    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        // GPS is ON
        Log.d(TAG, "GPS is ON");
    }

    @Override
    public void onProviderDisabled(String provider) {
        // GPS is OFF
        Log.d(TAG, "GPS is OFF");
    }

    // GPS dialog
    public boolean canGetLocation() {
        return this.canGetLocation;
    }
    // don't really need this when testing
    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        alertDialog.setTitle(R.string.gps_settings_title);

        alertDialog.setMessage(R.string.gps_settings_msg);
        alertDialog.setPositiveButton(R.string.gps_settings_word, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivities(new Intent[]{intent}); // hm...
            }
        });
        alertDialog.show();
    }

    public void stopUsingGPS() {
        if(locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }
}

GPSTracker.java में पुनर्व्यवस्थित लेकिन फिर भी काम करने की अनुमति नहीं है:

int permissionCheck = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if(!(permissionCheck == PackageManager.PERMISSION_GRANTED)) {
    if(ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, Manifest.permission.ACCESS_FINE_LOCATION)) {
        // explanation :p
        Log.i(TAG, "NOpe...");
    } else {
        // request permission
        Log.d(TAG, "Requestion new permission");
        ActivityCompat.requestPermissions((Activity) mContext, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

MainActivity.java

package com.tutorial.android.location.api;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    String TAG = "¤";

    GPSTracker gps;

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

        gps = new GPSTracker(this);

        if(gps.canGetLocation()) {
            Log.i(TAG, "onCreate() GPS is ON");
            Log.i(TAG, "onCreate() " + gps.getLatitude()+ ", " + gps.getLongitude());
        } else {
            Log.d(TAG, "onCreate() GPS is OFF");
        }

    }
}

यह ट्यूटोरियल सबसे अधिक आशाजनक लगता है

यह वास्तव में भयानक कोड है।

मैं केवल 0.0, 0.0 का एक जीपीएस समन्वय वापस करने के लिए इस कोड को प्राप्त कर सकता हूं, जो बहुत उपयोगी नहीं है

ऐसा इसलिए है क्योंकि यह केवल एक स्थान होगा यदि getLastKnownLocation() एक को वापस करने के लिए होता है। ऐसा करने की संभावना नहीं है।

GPSTracker.java में पुनर्व्यवस्थित लेकिन फिर भी काम करने की अनुमति नहीं है:

यहां पर दो समस्याएं हैं:

  1. आप किसी सेवा से अनुमति का अनुरोध नहीं कर सकते।

  2. यह वास्तविक सेवा नहीं है। इस कोड के लेखक को एक वर्ग बनाने के लिए चुना गया है जो वास्तव में सेवा को ठीक से लागू करने या उपयोग किए बिना Service विस्तार करता है। यह वही है जो आपके NullPointerException का कारण बन रहा है, क्योंकि यह ठीक से आरंभिक Context

क्या कोई मुझे यहाँ सही दिशा में इंगित कर सकता है?

यह सब बाहर फेंक दो।

FWIW, यहाँ LocationManager API का उपयोग करने के लिए मेरा नमूना ऐप है।

नुस्खा काफी सरल है:

चरण # 1: कुछ Context पर getSystemService(Context.LOCATION_SERVICE) पर कॉल करके एक LocationManager getSystemService(Context.LOCATION_SERVICE) प्राप्त करें। मुझे लगता है कि एक टुकड़े में ऐसा होता है:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    template=getActivity().getString(R.string.url);
    mgr=(LocationManager)getActivity()
      .getSystemService(Context.LOCATION_SERVICE);
  }

चरण # 2: कॉल requestUpdates() , कुछ में गुजर रहा है कि LocationListener लागू करता है। मेरे मामले में, वह स्वयं ही खंडित हो जाता है:

  @Override
  @SuppressWarnings({"MissingPermission"})
  public void onStart() {
    super.onStart();

    mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3600000,
      1000, this);
  }

चरण # 3: अपने LocationListener onLocationChanged() में, उस Location साथ कुछ करें, जो आपको मिलता है, जो मेरे मामले में मौसम का पूर्वानुमान प्राप्त करने के लिए एक AsyncTask को निष्पादित करने के लिए है:

  @Override
  public void onLocationChanged(Location location) {
    new FetchForecastTask().execute(location);
  }

चरण # 4: जब आप कर रहे हैं, तो कॉल removeUpdates() :

  @Override
  @SuppressWarnings({"MissingPermission"})
  public void onStop() {
    mgr.removeUpdates(this);

    super.onStop();
  }

और वह यह है (रनटाइम अनुमति सामान के अलावा, जिसे मैं एक AbstractPermissionsActivity संक्षेप में बाहर निकालता हूं)।

यदि आप चाहते हैं, एक अनुकूलन के रूप में getLastKnownLocation() उपयोग करें, लेकिन इस पर भरोसा न करें।





gps