mardi 12 mai 2015

CGM intent service not being called when I send push to android device

There must be something I'm doing wrong but I'm new in android studio and I can't find it. I have an app which displays four webViews, each in a tab and I'm trying to send a push from CGM, the json response code is ok, but my device is never pushed and my GCM intent service is never called.

{"multicast_id":4710708383941694704,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1431447972667924%e17d0a39f9fd7ecd"}]}{"registration_ids":["XxxxXXx"],"data":{"message":"New content available!"}}

my main activity file:

    public class MainActivity extends inicioActivity implements ActionBar.TabListener {

        public static final String PROPERTY_REG_ID = "registration_id";
        private static final String PROPERTY_APP_VERSION = "appVersion";
        private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;

        String SENDER_ID = "xxxXXXxxxXxxx";
        static final String TAG = "GuiasWebTabApp";

        TextView mDisplay;
        GoogleCloudMessaging gcm;
        AtomicInteger msgId = new AtomicInteger();
        SharedPreferences prefs;
        Context context;
        String regid;

        SectionsPagerAdapter mSectionsPagerAdapter;


        ViewPager mViewPager;
        private WebView myWebView;
        private WebView myWebView2;
        private WebView myWebView3;
        private WebView myWebView4;
        private ActionBar actionBar = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            //init webViews
            setContentView(R.layout.fragment_main);

            this.myWebView = (WebView) findViewById(R.id.activity_main_webview);
            myWebView.setWebViewClient(new WebViewClient());
            WebSettings webSettings = myWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            myWebView.loadUrl("http://ift.tt/1QFPA1Y");


            this.myWebView2 = (WebView) findViewById(R.id.activity_main_webview2);
            myWebView2.setWebViewClient(new WebViewClient());
            WebSettings webSettings2 = myWebView2.getSettings();
            webSettings2.setJavaScriptEnabled(true);
            myWebView2.loadUrl("http://ift.tt/1Ja3cQS");
            myWebView2.setVisibility(View.INVISIBLE);

            this.myWebView3 = (WebView) findViewById(R.id.activity_main_webview3);
            myWebView3.setWebViewClient(new WebViewClient());
            WebSettings webSettings3 = myWebView3.getSettings();
            webSettings3.setJavaScriptEnabled(true);
            myWebView3.loadUrl("http://ift.tt/1QFPyqS");
            myWebView3.setVisibility(View.INVISIBLE);

            this.myWebView4 = (WebView) findViewById(R.id.activity_main_webview4);
            myWebView4.setWebViewClient(new WebViewClient());
            WebSettings webSettings4 = myWebView4.getSettings();
            webSettings4.setJavaScriptEnabled(true);
            myWebView4.loadUrl("http://ift.tt/1Ja3aIN");
            myWebView4.setVisibility(View.INVISIBLE);


            setContentView(R.layout.activity_main);

            //initialize variables
            context = getApplicationContext();
            gcm = GoogleCloudMessaging.getInstance(this);
            prefs = getPreferences(0);
            mDisplay = new TextView(getApplicationContext());

            // Set up the action bar.
            actionBar = getSupportActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

            actionBar.setTitle("Guias Del Sur");
            getSupportActionBar().setCustomView(R.layout.activity_actividades);


            // Create the adapter that will return a fragment for each of the three
            // primary sections of the activity.
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);


            if (checkPlayServices()) {
                gcm = GoogleCloudMessaging.getInstance(this);
                regid = getRegistrationId(context);

                if (regid.isEmpty()) {
                    registerInBackground();
                    Log.i(TAG, "ok");
                }
            } else {
                Log.i(TAG, "No valid Google Play Services APK found.");

            }

            mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                    switch (position) {
                        case 0: {
                            // web view
                            myWebView.setVisibility(View.VISIBLE);
                            myWebView2.setVisibility(View.INVISIBLE);
                            myWebView3.setVisibility(View.INVISIBLE);
                            myWebView4.setVisibility(View.INVISIBLE);
                            break;
                            //setContentView(R.layout.activity_main);
                        }
                        case 1: {

                            myWebView.setVisibility(View.INVISIBLE);
                            myWebView2.setVisibility(View.VISIBLE);
                            myWebView3.setVisibility(View.INVISIBLE);
                            myWebView4.setVisibility(View.INVISIBLE);
                            break;
                        }
                        case 2: {

                            myWebView.setVisibility(View.INVISIBLE);
                            myWebView2.setVisibility(View.INVISIBLE);
                            myWebView3.setVisibility(View.VISIBLE);
                            myWebView4.setVisibility(View.INVISIBLE);
                            break;
                        }
                        case 3: {
                            myWebView.setVisibility(View.INVISIBLE);
                            myWebView2.setVisibility(View.INVISIBLE);
                            myWebView3.setVisibility(View.INVISIBLE);
                            myWebView4.setVisibility(View.VISIBLE);
                            break;
                        }
                    }
                }
            });


            // For each of the sections in the app, add a tab to the action bar.
            for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {

                if(i==0) {
                    actionBar.addTab(
                            actionBar.newTab()
                                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                                    .setTabListener(this)
                                    .setIcon(R.drawable.inicio1)

                    );
                }
                if(i==1) {
                    actionBar.addTab(
                            actionBar.newTab()
                                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                                    .setTabListener(this)
                                    .setIcon(R.drawable.actividades1)

                    );
                }
                if(i==2) {
                    actionBar.addTab(
                            actionBar.newTab()
                                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                                    .setTabListener(this)
                                    .setIcon(R.drawable.ic_bota)

                    );
                }
                if(i==3) {
                    actionBar.addTab(
                            actionBar.newTab()
                                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                                    .setTabListener(this)
                                    .setIcon(R.drawable.nosotros1)

                    );
                }


            }
        }

        @Override
        protected void onResume() {
            super.onResume();
            checkPlayServices();
        }

        //Check the device to make sure it has the Google Play Services APK.
        private boolean checkPlayServices() {

            int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
            if (resultCode != ConnectionResult.SUCCESS) {
                if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                    GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                            PLAY_SERVICES_RESOLUTION_REQUEST).show();
                } else {
                    Log.d(TAG, "This device is not supported.");

                    finish();
                }
                return false;
            }
            return true;
        }
        /**
         * Gets the current registration ID for application on GCM service.
         */
        private String getRegistrationId(Context context) {
            final SharedPreferences prefs = getGCMPreferences(context);
            String registrationId = prefs.getString(PROPERTY_REG_ID, "");
            if (registrationId.isEmpty()) {
                Log.i(TAG, "Registration not found.");
                return "";
            }

            int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
            int currentVersion = getAppVersion(context);
            if (registeredVersion != currentVersion) {
                Log.i(TAG, "App version changed.");
                return "";
            }
            return registrationId;
        }

        /**
         * @return Application's {@code SharedPreferences}.
         */
        private SharedPreferences getGCMPreferences(Context context) {
            return getSharedPreferences(MainActivity.class.getSimpleName(),
                    Context.MODE_PRIVATE);
        }


        /**
         * @return Application's version code from the {@code PackageManager}.
         */
        private static int getAppVersion(Context context) {
            try {
                PackageInfo packageInfo = context.getPackageManager()
                        .getPackageInfo(context.getPackageName(), 0);
                return packageInfo.versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                // should never happen
                throw new RuntimeException("Could not get package name: " + e);
            }
        }

        /**
         * Registers the application with GCM servers asynchronously.
         */
        private void registerInBackground() {

            new AsyncTask<Void,Void,String>() {
                @Override
                protected String doInBackground(Void... params) {
                    String msg = "";
                    try {

                        regid = gcm.register(SENDER_ID);


                        msg = "Device registered, registration id=" + regid;
                        sendRegistrationIdToBackend();

                        SharedPreferences.Editor editor = prefs.edit();
                        editor.putString(PROPERTY_REG_ID, regid);
                        editor.commit();
                    } catch (IOException ex) {
                        msg = "Error :" + ex.getMessage();
                    }
                    return msg;
                }

                @Override
                protected void onPostExecute(String msg) {
                    mDisplay.append(msg + "\n");
                }
            }.execute();
        }
        private String readStream(InputStream is) {
            try {
                ByteArrayOutputStream bo = new ByteArrayOutputStream();
                int i = is.read();
                while(i != -1) {
                    bo.write(i);
                    i = is.read();
                }
                return bo.toString();
            } catch (IOException e) {
                return "";
            }
        }

        /**
         * Sends the registration ID to your server
         */
        private void sendRegistrationIdToBackend() {
            HttpURLConnection urlConnection = null;
            try {

                URL url = new URL("http://ift.tt/1QFPA20"+regid);
                urlConnection = (HttpURLConnection) url.openConnection();

                /** Connecting to url */
                urlConnection.connect();

                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                readStream(in);
            }catch(Exception e){
                Log.d("Exception url ", e.toString());
            }finally {
                urlConnection.disconnect();
            }
        }


        /**
         * Stores the registration ID and app versionCode in the application's */

        private void storeRegistrationId(Context context, String regId) {
            final SharedPreferences prefs = getGCMPreferences(context);
            int appVersion = getAppVersion(context);
            Log.i(TAG, "Saving regId on app version " + appVersion);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(PROPERTY_REG_ID, regId);
            editor.putInt(PROPERTY_APP_VERSION, appVersion);
            editor.commit();
        }
        public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                // Explicitly specify that GcmIntentService will handle the intent.
                ComponentName comp = new ComponentName(context.getPackageName(),
                        GcmIntentService.class.getName());
                // Start the service, keeping the device awake while it is launching.
                startWakefulService(context, (intent.setComponent(comp)));
                setResultCode(Activity.RESULT_OK);
            }
        }


        public class GcmIntentService extends IntentService {
            public static final int NOTIFICATION_ID = 1;
            private NotificationManager mNotificationManager;
            NotificationCompat.Builder builder;

            public GcmIntentService() {
                super("GcmIntentService");

            }

            @Override
            protected void onHandleIntent(Intent intent) {
                Bundle extras = intent.getExtras();
                GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
                // The getMessageType() intent parameter must be the intent you received
                // in your BroadcastReceiver.
                String messageType = gcm.getMessageType(intent);

                if (!extras.isEmpty()) { 

                    if (GoogleCloudMessaging.
                            MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                        sendNotification("Send error: " + extras.toString());
                    } else if (GoogleCloudMessaging.
                            MESSAGE_TYPE_DELETED.equals(messageType)) {
                        sendNotification("Deleted messages on server: " +
                                extras.toString());
                        // If it's a regular GCM message, do some work.
                    } else if (GoogleCloudMessaging.
                            MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                        // This loop represents the service doing some work.
                        for (int i=0; i<5; i++) {
                            Log.i(TAG, "Working... " + (i+1)
                                    + "/5 @ " + SystemClock.elapsedRealtime());
                            try {
                                Thread.sleep(5000);
                            } catch (InterruptedException e) {
                            }
                        }
                        Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
                        // Post notification of received message.
                        sendNotification("Received: " + extras.toString());
                        Log.i(TAG, "Received: " + extras.toString());
                    }
                }
                // Release the wake lock provided by the WakefulBroadcastReceiver.
                GcmBroadcastReceiver.completeWakefulIntent(intent);
            }

            // Put the message into a notification and post it.
            // This is just one simple example of what you might choose to do with
            // a GCM message.
            private void sendNotification(String msg) {
                mNotificationManager = (NotificationManager)
                        this.getSystemService(Context.NOTIFICATION_SERVICE);

                PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                        new Intent(this, MainActivity.class), 0);

                NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(this)
                                .setSmallIcon(R.drawable.ic_logo_guias)
                                .setContentTitle("GCM Notification")
                                .setStyle(new NotificationCompat.BigTextStyle()
                                        .bigText(msg))
                                .setContentText(msg);

                mBuilder.setContentIntent(contentIntent);
                mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            switch (item.getItemId()) {
                case R.id.action_refresh:{
                    int num = actionBar.getSelectedNavigationIndex();
                    switch (num){
                        case 0:{
                            myWebView.loadUrl("http://example.com/");
                            break;
                        }
                        case 1:{
                            myWebView2.loadUrl("http://example.com/2");
                            break;
                        }
                        case 2:{
                            myWebView3.loadUrl("http://example.com/3");
                            break;
                        }
                        case 3:{
                            myWebView4.loadUrl("http://example.com/4");
                            break;
                        }
                    }

                }
                case R.id.action_settings: {
                    return true;
                }
            }

            return super.onOptionsItemSelected(item);
        }

        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
            mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        }

        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        }

        /**
         * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
         * one of the sections/tabs/pages.
         */
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }

            @Override
            public Fragment getItem(int position) {
                return PlaceholderFragment.newInstance(position + 1);
            }

            @Override
            public int getCount() {
                return 4;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                Locale l = Locale.getDefault();
                switch (position) {
                    case 0:
                        return getString(R.string.title_section1).toUpperCase(l);
                    case 1:
                        return getString(R.string.title_section2).toUpperCase(l);
                    case 2:
                        return getString(R.string.title_section3).toUpperCase(l);
                    case 3:
                        return getString(R.string.title_section4).toUpperCase(l);
                }
                return null;
            }
        }

        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {
            /**
             * The fragment argument representing the section number for this
             * fragment.
             */
            private static final String ARG_SECTION_NUMBER = "section_number";

            /**
             * Returns a new instance of this fragment for the given section
             * number.
             */
            public static PlaceholderFragment newInstance(int sectionNumber) {
                PlaceholderFragment fragment = new PlaceholderFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_SECTION_NUMBER, sectionNumber);
                fragment.setArguments(args);
                return fragment;
            }

            public PlaceholderFragment() {
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
                return rootView;
            }
        }
        //back device button
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && this.myWebView.canGoBack()) {
                this.myWebView.goBack();
                return true;
            }

            return super.onKeyDown(keyCode, event);
        }

    }

Android manifest file:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://ift.tt/nIICcg"
    package="com.example.alfredo.guiaswebtabapp" >
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="22"/>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="com.example.alfredo.guiaswebtabapp.permission.C2D_MESSAGE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="com.example.alfredo.guiaswebtabapp.permission.C2D_MESSAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait"
            android:configChanges="keyboardHidden|orientation"
            android:label="@string/app_name" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".MainActivity$GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >

            <intent-filter>

                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.google.android.gcm.demo.app" />
            </intent-filter>
        </receiver>
        <service android:name=".MainActivity$GcmIntentService"
            android:enabled="true" />

        <activity
            android:name=".inicioActivity"
            android:label="@string/title_activity_inicio" >
        </activity>
        <activity
            android:name=".ActividadesActivity"
            android:label="@string/title_activity_actividades" >
        </activity>
    </application>
</manifest>

Aucun commentaire:

Enregistrer un commentaire