在LocationManager中获取错误

时间:2016-04-19 06:53:28

标签: android

我一直试图获取当前地址而不在代码中隐含地提及纬度和经度但是使用GPS使用LocationManager

我在以下程序的LocationManager行中只收到一个错误:

     package com.example.admin.getcurrentlocation;


        import java.io.IOException;
        import java.util.List;
        import java.util.Locale;

        import android.app.Activity;
        import android.app.AlertDialog;
        import android.content.ContentResolver;
        import android.content.Context;
        import android.content.DialogInterface;
        import android.content.Intent;
        import android.content.pm.ActivityInfo;
        import android.location.Address;
        import android.location.Geocoder;
        import android.location.Location;
        import android.location.LocationListener;
        import android.location.LocationManager;
        import android.os.Bundle;
        import android.provider.Settings;
        import android.util.Log;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.ProgressBar;
        import android.widget.Toast;

        public class MainActivity extends Activity implements OnClickListener {

            private LocationManager locationMangaer=null;
            private LocationListener locationListener=null;

            private Button btnGetLocation = null;
            private EditText editLocation = null;
            private ProgressBar pb =null;

            private static final String TAG = "Debug";
            private Boolean flag = false;

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


                //if you want to lock screen for always Portrait mode
                setRequestedOrientation(ActivityInfo
                        .SCREEN_ORIENTATION_PORTRAIT);

                pb = (ProgressBar) findViewById(R.id.progressBar1);
                pb.setVisibility(View.INVISIBLE);

                editLocation = (EditText) findViewById(R.id.editTextLocation);

                btnGetLocation = (Button) findViewById(R.id.btnLocation);
                btnGetLocation.setOnClickListener(this);

                locationMangaer = (LocationManager)
                        getSystemService(Context.LOCATION_SERVICE);

            }

            @Override
            public void onClick(View v) {
                flag = displayGpsStatus();
                if (flag) {

                    Log.v(TAG, "onClick");

                    editLocation.setText("Please!! move your device to"+
                            " see the changes in coordinates."+"\nWait..");

                    pb.setVisibility(View.VISIBLE);
                    locationListener = new MyLocationListener();
       <--------------Error in this line------------->
     locationMangaer.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10,locationListener); 

                } else {
                    alertbox("Gps Status!!", "Your GPS is: OFF");
                }

            }

            /*----Method to Check GPS is enable or disable ----- */
            private Boolean displayGpsStatus() {
                ContentResolver contentResolver = getBaseContext()
                        .getContentResolver();
                boolean gpsStatus = Settings.Secure
                        .isLocationProviderEnabled(contentResolver,
                                LocationManager.GPS_PROVIDER);
                if (gpsStatus) {
                    return true;

                } else {
                    return false;
                }
            }

            /*----------Method to create an AlertBox ------------- */
            protected void alertbox(String title, String mymessage) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("Your Device's GPS is Disable")
                        .setCancelable(false)
                        .setTitle("** Gps Status **")
                        .setPositiveButton("Gps On",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        // finish the current activity
                                        // AlertBoxAdvance.this.finish();
                                        Intent myIntent = new Intent(
                                                Settings.ACTION_SECURITY_SETTINGS);
                                        startActivity(myIntent);
                                        dialog.cancel();
                                    }
                                })
                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        // cancel the dialog box
                                        dialog.cancel();
                                    }
                                });
                AlertDialog alert = builder.create();
                alert.show();
            }

            /*----------Listener class to get coordinates ------------- */
            private class MyLocationListener implements LocationListener {
                @Override
                public void onLocationChanged(Location loc) {

                    editLocation.setText("");
                    pb.setVisibility(View.INVISIBLE);
                    Toast.makeText(getBaseContext(),"Location changed : Lat: " +
                                    loc.getLatitude()+ " Lng: " + loc.getLongitude(),
                            Toast.LENGTH_SHORT).show();
                    String longitude = "Longitude: " +loc.getLongitude();
                    Log.v(TAG, longitude);
                    String latitude = "Latitude: " +loc.getLatitude();
                    Log.v(TAG, latitude);

            /*----------to get City-Name from coordinates ------------- */
                    String cityName=null;
                    Geocoder gcd = new Geocoder(getBaseContext(),
                            Locale.getDefault());
                    List<Address>  addresses;
                    try {
                        addresses = gcd.getFromLocation(loc.getLatitude(), loc
                                .getLongitude(), 1);
                        if (addresses.size() > 0)
                            System.out.println(addresses.get(0).getLocality());
                        cityName=addresses.get(0).getLocality();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    String s = longitude+"\n"+latitude +
                            "\n\nMy Currrent City is: "+cityName;
                    editLocation.setText(s);
                }

                @Override
                public void onProviderDisabled(String provider) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onProviderEnabled(String provider) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onStatusChanged(String provider,
                                            int status, Bundle extras) {
                    // TODO Auto-generated method stub
                }
            }
        }

这是我的Logcat。

 Process: com.example.admin.getcurrentlocation, PID: 3006
        java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:606)
        at android.location.LocationManager.requestLocationUpdates(LocationManager.java:885)
        at android.location.LocationManager.requestLocationUpdates(LocationManager.java:469)
        at com.example.admin.getcurrentlocation.MainActivity.onClick(MainActivity.java:77)
        at android.view.View.performClick(View.java:5269)
        at android.view.View$PerformClick.run(View.java:21556)
        at android.os.Handler.handleCallback(Handler.java:815)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5769)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)




Manifest File:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.admin.getcurrentlocation">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

3 个答案:

答案 0 :(得分:1)

您似乎缺少在清单中添加以下权限。

由于GPS位置提供商需要此权限。

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

答案 1 :(得分:0)

将这些内容放入manifest.xml

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

答案 2 :(得分:0)

正如其他答案所提到的,您必须在清单文件中请求权限。 但是,如果您支持Android 6,则必须检查是否已授予权限 之前开始使用该权限。例如:

void requestLocationPermission() {

    int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission. ACCESS_FINE_LOCATION);
    if ((permissionCheck == PackageManager.PERMISSION_GRANTED)) {

        Toast.makeText(this, "Location activated", Toast.LENGTH_SHORT).show();

    } else {

        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission. ACCESS_FINE_LOCATION}, 42);

    }
}

阅读doc以获取运行时权限以获取详细信息。