简体   繁体   English

通过GCM推送通知打开地图活动

[英]Open Map Activity from GCM Push Notification

I am trying to open a specific activity called 'MapActivity' where I want to load my current position on a map and get nearby places. 我正在尝试打开一个名为“ MapActivity”的特定活动,我想在该活动中在地图上加载当前位置并获取附近的地点。 I got that working and also got GCM working to send push notifications to my device (Android 4.3). 我可以正常工作,还可以通过GCM来向我的设备(Android 4.3)发送推送通知。 The only problem left is opening that activity I wanted, everytime I click on the message it will end up on error. 剩下的唯一问题是打开我想要的活动,每当我单击该消息时,它将以错误结束。

Here is the activity I want to load: 这是我要加载的活动:

public class MapActivity extends FragmentActivity implements LocationListener {
    private ProgressDialog pDialog, wDialog;
    //private static String dataUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-7.288804,%20112.814649&radius=5000&types=hospital&key=AIzaSyDuc4ab9iT7VPSZMCdKI416yQOeLprV5ME";

    private String API_KEY = "###MYAPIKEY###";
    private String PLACES_TYPE = "hospital";
    private String RADIUS = "5000";
    private static final int MAX_PLACES = 20;

    private static final String TAG_RESULTS = "results";
    private static final String TAG_GEOMETRY = "geometry";
    private static final String TAG_LOCATION = "location";
    private static final String TAG_LAT = "lat";
    private static final String TAG_LNG = "lng";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_VICINITY = "vicinity";

    private GoogleMap mMap;
    protected LocationManager locationManager;
    protected android.location.LocationListener locationListener;
    protected Context context;

    JSONArray tagResults = null;
    ArrayList<HashMap<String,String>> hospitalList;
    protected double currLat, currLng;
    Location currLocation;
    LatLng currLatLng;
    private boolean alreadySet = false;

    public void onProviderDisabled(String provider){
        Log.d("Latitude", "disable");
    }

    public void onProviderEnabled(String provider){
        Log.d("Latitude","enable");
    }

    public void onStatusChanged(String provider, int status, Bundle extras){
        Log.d("Latitude", "status");
    }

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

        hospitalList = new ArrayList<HashMap<String,String>>();

        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (android.location.LocationListener) this);



        new GetPlaces().execute();
    }

    @Override
    public void onLocationChanged(Location location) {
        if(alreadySet == false) {
            alreadySet = true;
            currLat = location.getLatitude();
            currLng = location.getLongitude();
            currLocation = new Location("Current Location");
            currLocation.setLatitude(location.getLatitude());
            currLocation.setLongitude(location.getLongitude());
            currLatLng = new LatLng(currLocation.getLatitude(),currLocation.getLongitude());
        }
    }



    private class GetPlaces extends AsyncTask<Void,Void,Void> {

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            pDialog = new ProgressDialog(MapActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            while ( currLocation == null ) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            String api_address = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?";
            String api_lat = Double.toString(currLocation.getLatitude());
            String api_lng = Double.toString(currLocation.getLongitude());
            String param_location = "location=" + api_lat + "," + api_lng;
            String param_radius = "&radius=5000";
            String param_types = "&types=hospital";
            String param_key = "&key=AIzaSyDuc4ab9iT7VPSZMCdKI416yQOeLprV5ME";

            String apiURL = api_address + param_location + param_radius + param_types + param_key;

            ServiceHandler serviceHandler = new ServiceHandler();
            String jsonResponse = serviceHandler.makeServiceCall(apiURL,ServiceHandler.GET);
            Log.d("Response: ", "> " + jsonResponse);
            if(jsonResponse!=null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonResponse);
                    tagResults = jsonObj.getJSONArray(TAG_RESULTS);
                    for(int i=0; i<tagResults.length(); i++) {
                        JSONObject resultObj = tagResults.getJSONObject(i);
                        String id = resultObj.getString(TAG_ID);
                        String name = resultObj.getString(TAG_NAME);
                        String vicinity = resultObj.getString(TAG_VICINITY);
                        JSONObject geometryObj = resultObj.getJSONObject(TAG_GEOMETRY);
                        JSONObject locationObj = geometryObj.getJSONObject(TAG_LOCATION);
                        String lat = locationObj.getString(TAG_LAT);
                        String lng = locationObj.getString(TAG_LNG);
                        HashMap<String, String> hospital = new HashMap<String, String>();
                        hospital.put(TAG_ID, id);
                        hospital.put(TAG_NAME, name);
                        hospital.put(TAG_VICINITY, vicinity);
                        hospital.put(TAG_LAT, lat);
                        hospital.put(TAG_LNG, lng);
                        hospitalList.add(hospital);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }
            return null;
        }

        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if(pDialog.isShowing()) {
                pDialog.dismiss();
            }
            if (mMap == null) {
                mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                        .getMap();
                if (mMap != null) {
                    for(int i=0; i<MAX_PLACES; i++)
                    {
                        mMap.addMarker(new MarkerOptions()
                                        .position(currLatLng)
                                        .title("You are here now.")
                                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                        );
                        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currLatLng, 14));
                        mMap.addMarker(new MarkerOptions()
                                        .position(new LatLng(Float.parseFloat(hospitalList.get(i).get(TAG_LAT)), Float.parseFloat(hospitalList.get(i).get(TAG_LNG))))
                                        .title(hospitalList.get(i).get(TAG_NAME))
                                        .snippet(hospitalList.get(i).get(TAG_VICINITY))
                        );
                    }
                }
            }
        }
    }
}

And here is the function where I use to send the notification on MyGCMListernerService.java 这是我用来在MyGCMListernerService.java上发送通知的函数

public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";

    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        Log.d(TAG, "DATA: " + data);
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + message);

        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
        sendNotification(message);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received GCM message.
     *
     * @param message GCM message received.
     */
    private void sendNotification(String message) {
        Intent intent = new Intent(this, MapActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 0);
        Log.i(TAG, "GCM Message: " + message);
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle("GCM Message")
                .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                .setContentText(message)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

I tried to set the Intent like this but it didn't work, it's showing like it was opening the activity tho, but then it says the app is closed. 我试图这样设置Intent,但是它没有用,显示它正在打开活动,但是随后它说应用程序已关闭。

Intent notificationIntent = new Intent(context, MapActivity.class);
PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0)

Would there be anyone willing to help point what's wrong in my code and what should I do to fix it? 会有人愿意帮助指出我的代码中有什么问题以及如何解决该问题吗? Thank you so much. 非常感谢。

************************ EDIT ************************* ************************编辑*************************

I tried to open an empty activity and it worked.. I wonder if there's something wrong with my Map Activity? 我试图打开一个空的活动,但它起作用了。.我想知道我的“地图活动”是否有问题? If it is used on a stand-alone app, it worked perfectly though. 如果在独立应用程序上使用它,则效果很好。

I tried to make a new blank activity again, and paste all of my MapActivity code inside it and now I'm getting an error like this: 我试图再次进行一个新的空白活动,然后将所有MapActivity代码粘贴到其中,现在出现如下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{gcm.play.android.samples.com.gcmquickstart/gcm.play.android.samples.com.gcmquickstart.MainActivity2Activity}: java.lang.ClassCastException: gcm.play.android.samples.com.gcmquickstart.MainActivity2Activity cannot be cast to android.location.LocationListener

And it points out to this line 它指出了这一行

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (android.location.LocationListener) this);

MapActivity is extend by Fragment Activity and inside this you are opening Map ie also opening inside a fragment so you cannot make a call to map directly with help of intent. MapActivity由Fragment Activity扩展,在其中您将打开Map,即也在一个片段内部打开,因此您无法在intent的帮助下直接调用map。 you can do this like as: ((MyFragmentActivity) getActivity()).replaceFragments(); 您可以这样操作:((MyFragmentActivity)getActivity())。replaceFragments(); and then inside fragment activity replace that fragment. 然后在片段活动内部替换该片段。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM