Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alert Dialogue has protected Access

Tags:

android

Im experimenting with android development, and getting the location of a device.

my GPSTracker class is listed below with the error being thrown.

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
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.util.Log;

/**
 * Created by informationservices on 29/08/14.
 */
public class GPSTracker extends Service implements LocationListener {


    private final Context mContext;

    //flag for GPS status
    boolean isGPSEnabled = false;
    //flag for network status
    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    Location location;
    double latitude; //latitude variable
    double longitude; //longitude variable

    //The minimum distance to change updates in meters

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1;
    private static final long MIN_TIME_BW_UPDATES = 1000;

    //declare location manager
    protected LocationManager locationManager;


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

    //function to get latitude
    public double getLatitude(){
        if (location != null){
            latitude = location.getLatitude();

        }
        //must have a return (as its a function)
        return latitude;
    }

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

        return longitude;
    }





    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

            //getting GPS Status
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            //getting Network Status
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                //No Network provider is enabled
            }else{
                this.canGetLocation=true;
                //first get location from Network Provider
                if(isNetworkEnabled){
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager !=null){
                        location=locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if(location !=null){
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();

                        }
                    }
                }

            }
        }
        catch (Exception e){
            e.printStackTrace();

        }
        return location;
    }

    //check if this is the best network provider
    public boolean canGetLocation(){
        return this.canGetLocation;
    }

    //show GPs settings in alert box
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog(mContext);//AlertDialog(android.content.Context) has protected access in 'android.app.AlertDialog'

        //set alert title
        alertDialog.setTitle("GPS is Settings");

        //set Dialog message
        alertDialog.setMessage("GPS is not Enabled. Do you want to go to settings menu?");

        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivities(new Intent[]{intent});

            }
        });

        alertDialog.setNegativeButton("Cancel",new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                dialog.cancel();
            }
        });

        //show alert
        alertDialog.show();
    }


    @Override
    public void onLocationChanged(Location location) {

    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

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

This is my first attempt at coding for android. I have been googling for a while, but can't see why it is throwing this error.

Could someone please explain what this error means, and how to fix it.

a thorough explication, and link to any relevant google docs would also be appreciated.

like image 722
scb998 Avatar asked Aug 29 '14 01:08

scb998


2 Answers

The error means that the AlertDialog constructor is not accessible (public). It is declared protected so the programmers are forced to use a builder pattern when working with AlertDialogs.

To show an AlertDialog, you use the AlertDialog.Builder to set everything up and then call show() to build and show the AlertDialog.

// Use the AlertDialog.Builder to configure the AlertDialog.
AlertDialog.Builder alertDialogBuilder =
        new AlertDialog.Builder(this)
                .setTitle("GPS is Settings")
                .setMessage("GPS is not Enabled. Do you want to go to settings menu?")
                .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        mContext.startActivities(new Intent[]{intent});
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

// Show the AlertDialog.
AlertDialog alertDialog = alertDialogBuilder.show();
like image 190
kjones Avatar answered Oct 13 '22 01:10

kjones


I counterd this problem because just now i was going to learn about the difference between AlertDialog.Builder and AlertDialog so when i wrote

AlertDialog dialog=new AlertDialog();

so it gave me the same problem like yours but since you wrote

AlertDialog.Builder alertDialog = new AlertDialog(mContext);

                                  //.Builder was missing
AlertDialog.Builder = new AlertDialog.Builder(mContext)

and if you want to use AlertDialog then do it like this

AlertDialog = new AlertDialog.Builder(mContext)

This should work.

like image 25
morees shdad Avatar answered Oct 13 '22 01:10

morees shdad