我正在尝试将 GPS 功能添加到我的 android 应用程序中,gps 坐标每次都会出现 0.0、0.0

Posted

技术标签:

【中文标题】我正在尝试将 GPS 功能添加到我的 android 应用程序中,gps 坐标每次都会出现 0.0、0.0【英文标题】:I'm trying to add GPS functionality to my android app, gps coordinates come out to 0.0, 0.0 every time 【发布时间】:2017-03-10 00:01:42 【问题描述】:

我想在应用程序启动和点击刷新按钮时检查 GPS,并使用这些数据点以 mLatitude 和 mLongitude 的形式调用天气 api。最终我将对城市进行地理编码,但现在出于调试目的,我将 GPS 坐标输出到 locationLabel 文本视图。

我的 MainActivity.java:

package com.example.paxie.stormy.ui;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.paxie.stormy.GPS_Service;
import com.example.paxie.stormy.R;
import com.example.paxie.stormy.weather.Current;
import com.example.paxie.stormy.weather.Day;
import com.example.paxie.stormy.weather.Forecast;
import com.example.paxie.stormy.weather.Hour;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;


public class MainActivity extends AppCompatActivity 

    public static final String TAG = MainActivity.class.getSimpleName();
    public static final String DAILY_FORECAST = "DAILY_FORECAST";
    public static final String HOURLY_FORECAST = "HOURLY_FORECAST";
    private Forecast mForecast;
    private double mLatitude;
    private double mLongitude;
    private BroadcastReceiver broadcastReceiver;

    @Bind(R.id.timeLabel)
    TextView mTimeLabel;
    @Bind(R.id.temperatureLabel)
    TextView mTemperatureLabel;
    @Bind(R.id.humidityValue)
    TextView mHumidityValue;
    @Bind(R.id.precipValue)
    TextView mPrecipValue;
    @Bind(R.id.summaryLabel)
    TextView mSummaryLabel;
    @Bind(R.id.iconImageView)
    ImageView mIconImageView;
    @Bind(R.id.refreshImageView)
    ImageView mRefreshImageView;
    @Bind(R.id.progressBar)
    ProgressBar mProgressBar;
    @Bind(R.id.locationLabel)
    TextView mLocationlabel;


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

        mProgressBar.setVisibility(View.INVISIBLE);

        mRefreshImageView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                getForecast();
            
        );


        getForecast();
        Log.d(TAG, "Main UI code is running!");
    

    private void getForecast() 
        if(!runtime_permissions())
        checkGPS();
        String apiKey = "1621390f8c36997cb1904914b726df52";
        String forecastUrl = "https://api.forecast.io/forecast/" + apiKey +
                "/" + mLatitude + "," + mLongitude;

        if (isNetworkAvailable()) 
            toggleRefresh();

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(forecastUrl)
                    .build();

            Call call = client.newCall(request);
            call.enqueue(new Callback() 
                @Override
                public void onFailure(Request request, IOException e) 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            toggleRefresh();
                        
                    );
                    alertUserAboutError();
                

                @Override
                public void onResponse(Response response) throws IOException 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            toggleRefresh();
                        
                    );
                    try 
                        String jsonData = response.body().string();
                        Log.v(TAG, jsonData);
                        if (response.isSuccessful()) 
                            mForecast = parseForecastDetails(jsonData);
                            runOnUiThread(new Runnable() 
                                @Override
                                public void run() 
                                    updateDisplay();
                                
                            );

                         else 
                            alertUserAboutError();

                        
                     catch (IOException e)

                    
                        Log.e(TAG, "Exception caught: ", e);
                     catch (JSONException e) 
                        e.printStackTrace();
                    
                
            );
         else 
            Toast.makeText(this, "Network is currently unavailable!", Toast.LENGTH_LONG).show();
        
    


    private void toggleRefresh() 
        if (mProgressBar.getVisibility() == View.INVISIBLE) 
            mProgressBar.setVisibility(View.VISIBLE);
            mRefreshImageView.setVisibility(View.INVISIBLE);
         else 
            mProgressBar.setVisibility(View.INVISIBLE);
            mRefreshImageView.setVisibility(View.VISIBLE);
        
    

    private void updateDisplay() 
        mLocationlabel.setText(mLatitude + " " + mLongitude);
        Current current = mForecast.getCurrent();
        mTemperatureLabel.setText(current.getTemperature() + "");
        mTimeLabel.setText("At " + current.getFormattedTime() + " it will be:");
        mHumidityValue.setText(current.getHumidity() + "");
        mPrecipValue.setText(current.getPrecipChance() + "%");
        mSummaryLabel.setText(current.getSummary());
        Drawable drawable = ContextCompat.getDrawable(this, current.getIconId());
        mIconImageView.setImageDrawable(drawable);
    

    private Forecast parseForecastDetails(String jsonData) throws JSONException 
        Forecast forecast = new Forecast();
        forecast.setCurrent(getCurrentDetails(jsonData));
        forecast.setHourlyForecast(getHourlyForecast(jsonData));
        forecast.setDailyForecast(getDailyForecast(jsonData));

        return forecast;

    

    private Day[] getDailyForecast(String jsonData) throws JSONException 
        JSONObject forecast = new JSONObject(jsonData);
        String timezone = forecast.getString("timezone");
        JSONObject daily = forecast.getJSONObject("daily");
        JSONArray data = daily.getJSONArray("data");

        Day[] days = new Day[data.length()];

        for (int i = 0; i < data.length(); i++) 
            JSONObject jsonDay = data.getJSONObject(i);
            Day day = new Day();

            day.setSummary(jsonDay.getString("summary"));
            day.setIcon(jsonDay.getString("icon"));
            day.setTemperatureMax(jsonDay.getDouble("temperatureMax"));
            day.setTime(jsonDay.getLong("time"));
            day.setTimeZone(timezone);

            days[i] = day;

        
        return days;
    

    private Hour[] getHourlyForecast(String jsonData) throws JSONException 
        JSONObject forecast = new JSONObject(jsonData);
        String timezone = forecast.getString("timezone");
        JSONObject hourly = forecast.getJSONObject("hourly");
        JSONArray data = hourly.getJSONArray("data");

        Hour[] hours = new Hour[data.length()];

        for (int i = 0; i < data.length(); i++) 
            JSONObject jsonHour = data.getJSONObject(i);
            Hour hour = new Hour();
            hour.setSummary(jsonHour.getString("summary"));
            hour.setTemperature(jsonHour.getDouble("temperature"));
            hour.setIcon(jsonHour.getString("icon"));
            hour.setTime(jsonHour.getLong("time"));
            hour.setTimeZone(timezone);

            hours[i] = hour;

        
        return hours;
    

    private Current getCurrentDetails(String jsonData) throws JSONException 
        JSONObject forecast = new JSONObject(jsonData);
        String timezone = forecast.getString("timezone");
        Log.i(TAG, "From JSON:  " + timezone);

        JSONObject currently = forecast.getJSONObject("currently");
        Current current = new Current();
        current.setHumidity(currently.getDouble("humidity"));
        current.setTime(currently.getLong("time"));
        current.setIcon(currently.getString("icon"));
        current.setPrecipChance(currently.getDouble("precipProbability"));
        current.setSummary(currently.getString("summary"));
        current.setTemperature(currently.getDouble("temperature"));
        current.setTimeZone(timezone);

        Log.d(TAG, current.getFormattedTime());

        return current;
    

    private boolean isNetworkAvailable() 
        ConnectivityManager manager = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        boolean isAvailable = false;
        if (networkInfo != null && networkInfo.isConnected()) 
            isAvailable = true;
        
        return isAvailable;
    


    private void alertUserAboutError() 
        AlertDialogFragment dialog = new AlertDialogFragment();
        dialog.show(getFragmentManager(), "error_dialog");
    


    @OnClick(R.id.dailyButton)
    public void startDailyActivity(View view) 
        Intent intent = new Intent(this, DailyForecastActivity.class);
        intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast());
        startActivity(intent);

    

    @OnClick(R.id.hourlyButton)
    public void startHourlyActivity(View view) 
        Intent intent = new Intent(this, HourlyForecastActivity.class);
        intent.putExtra(HOURLY_FORECAST, mForecast.getHourlyForecast());
        startActivity(intent);
    

    private void checkGPS() 
        if (broadcastReceiver == null) 
            broadcastReceiver = new BroadcastReceiver() 
                @Override
                public void onReceive(Context context, Intent intent) 
                    mLatitude = (double) intent.getExtras().get("latitude");
                    mLongitude = (double) intent.getExtras().get("longitude");
                
            ;
        
        registerReceiver(broadcastReceiver, new IntentFilter("location_update"));
    

    private boolean runtime_permissions() 
        if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 

            requestPermissions(new String[]Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, 100);

            return true;
        
        return false;
    


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) 
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) 
                getForecast();
             else 
                runtime_permissions();
            
        
    

    @Override
    protected void onResume() 
        super.onResume();
        checkGPS();
    

我的 GPSservice.java:

package com.example.paxie.stormy;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
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;

/**
 * Created by paxie on 10/27/16.
 */
public class GPS_Service extends Service 
    private LocationListener listener;
    private LocationManager locationManager;

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

    @Override
    public void onCreate() 

        listener = new LocationListener() 
            @Override
            public void onLocationChanged(Location location) 
                Intent i = new Intent("location_update");
                i.putExtra("coordinates",location.getLongitude()+" "+location.getLatitude());
                i.putExtra("longitude", location.getLongitude());
                i.putExtra("latitude", location.getLatitude());
                sendBroadcast(i);
            

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) 

            

            @Override
            public void onProviderEnabled(String s) 

            

            @Override
            public void onProviderDisabled(String s) 
                Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
            
        ;

        locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

        //noinspection MissingPermission
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,0,listener);

    

    @Override
    public void onDestroy() 
        super.onDestroy();
        if(locationManager != null)
            //noinspection MissingPermission
            locationManager.removeUpdates(listener);
        
    

【问题讨论】:

你看到我的回答了吗?你在哪里接触到这个? 【参考方案1】:

您可以尝试以下两件事:

1. 请确保您已在清单中包含ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限。如果您的应用面向 Android API 23 及更高版本,则需要包含运行时权限处理。

2.不应将LocationListener 对象作为类成员,而应将Service 实现为接口并实现其onLocationChanged() 方法。

除此之外,您确实应该考虑使用 Google Play 服务中的位置 API,而不是 AOSP 中的那些(即android.location)。

Making Your App Location-Aware

【讨论】:

以上是关于我正在尝试将 GPS 功能添加到我的 android 应用程序中,gps 坐标每次都会出现 0.0、0.0的主要内容,如果未能解决你的问题,请参考以下文章

使用 typeScript 滚动到我的 webView 上的 x,y 坐标

尝试将 Vlookup 片段添加到我的 Excel 宏

如何根据从 ajax 调用返回的数据动态地将选项添加到我的自动完成功能?

将数组添加到我的 ExecuteReader() 函数

如何将包目录结构添加到我的jar中

如何将嵌套字段添加到我的 BigQuery 表架构?