2016-10-18 2 views
0
The `MainActivity` registers with GCM Server and the `IntentService` sends `RegId` to the server. Wi-Fi Push Notification is working well but when running on 3G network, the MainActivity screen looks like blank screen and goes in wait state. I have spent a lot of hours for that but does not get any solution. 

I've the updated code below work fine on 3G but Server Doesnot get RegId Shared using Application: 

package com.appiphy.virtualnoticeboard; 

import android.content.ComponentName; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Handler; 
import android.provider.Settings; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.content.WakefulBroadcastReceiver; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.util.Log; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.appiphy.virtualnoticeboard.notification.Config; 
import com.appiphy.virtualnoticeboard.notification.ShareExternalServer; 
import com.google.android.gms.gcm.GoogleCloudMessaging; 

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

public class MainActivity extends AppCompatActivity { 
    private static int SPLASH_TIME_OUT = 1000; 
    ImageView splahImage; 
    String[] imageName; 
    private Context _context; 
    SharedPreferences megacare; 
    String status; 
    DatabaseHelper db; 
    Handler myHandler; 
    Runnable myRunnable; 
    String Msg, From; 

    String regId,From_Whom; 
    ArrayList<String> mylist = new ArrayList<String>(); 
    List<Notice> noticeList = new ArrayList<Notice>(); // server to db to noticeList 
    public NotificationReceiver nReceiver; 
    ShareExternalServer appUtil; 
    public static final String REG_ID = "regId"; 
    private static final String APP_VERSION = "appVersion"; 
    GoogleCloudMessaging gcm; 
    static final String TAG = "Register Activity"; 
    AsyncTask<Void, Void, String> shareRegidTask; 
    String result; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final SharedPreferences prefs1 = getSharedPreferences(
       MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); 
     regId = prefs1.getString(REG_ID, ""); 
     appUtil = new ShareExternalServer(); 
     Fragment gridView = new NoticeRowFragment(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.container_body, gridView); 
     fragmentTransaction.commit(); 

     /* if(isNetworkAvailable())*/ { 

     new AsyncTask<Void, Void, String>() { 
      @Override 
      protected String doInBackground(Void... params) { 
       if (regId.isEmpty()) 
       { 
        regId = registerGCM(); 
       } 
       System.out.println("RegisterActivityregisterGCM - successfully registered with GCM server - regId: " + regId); 
       return regId; 

      } 
      @Override 
      protected void onPostExecute(String msg) { 
       Toast.makeText(getApplicationContext(), 
         "Registered with GCM Server." + msg, Toast.LENGTH_LONG) 
         .show(); 
      } 
     }.execute(null, null, null); 

      shareRegidTask = new AsyncTask<Void, Void, String>() { 
       @Override 
       protected String doInBackground(Void... params) { 



        if (!regId.isEmpty()) 
        { 
          appUtil.shareRegIdWithAppServer(getApplicationContext(), regId); 
        } 
        else 
          result = appUtil.shareRegIdWithAppServer(getApplicationContext(), regId); 


        return result; 

       } 
       @Override 
       protected void onPostExecute(String result) 
       { 
        shareRegidTask = null; 
        Toast.makeText(getApplicationContext(), result, 
          Toast.LENGTH_LONG).show(); 
       } 

      }; 
      shareRegidTask.execute(null, null, null); 

      nReceiver = new NotificationReceiver(); 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction("com.appiphy.spacecomp.spinnerframework1.Notification"); 
      registerReceiver(nReceiver, filter); 

      /* Boolean value = isNotificationServiceRunning(); 
      if (!value) { 
       startActivity(new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)); 
      } 
      try { 
       regId = getIntent().getStringExtra("regId"); 
       Msg = getIntent().getStringExtra("Msg"); 
       From = getIntent().getStringExtra("From"); 
       //System.out.println("Message----InMain Activity.."+Msg); 

       if (From.equalsIgnoreCase("Notification")) { 
        Fragment gridView1 = new NoticeRowFragment(); 
        FragmentManager fragmentManager1 = getSupportFragmentManager(); 
        FragmentTransaction fragmentTransaction1 = fragmentManager1.beginTransaction(); 
        fragmentTransaction1.replace(R.id.container_body, gridView1); 
        fragmentTransaction1.commit(); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      }*/ 
     } 
     /* else 
     { 
      System.out.println("Check Network Connection"); 
     }*/ 
    } 
    private boolean isNotificationServiceRunning() 
    { 
     ContentResolver contentResolver = getContentResolver(); 
     String enabledNotificationListeners = Settings.Secure.getString(contentResolver, "enabled_notification_listeners"); 
     String packageName = getPackageName(); 
     return enabledNotificationListeners != null && enabledNotificationListeners.contains(packageName); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     unregisterReceiver(nReceiver); 
     super.onDestroy(); 
    } 

    class NotificationReceiver extends WakefulBroadcastReceiver 
    { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      ComponentName comp = new ComponentName(context.getPackageName(), 
        MainActivity.class.getName()); 
      startWakefulService(context, (intent.setComponent(comp))); 


      final SharedPreferences prefs1 = getSharedPreferences(
        MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); 
      String flagNotify = prefs1.getString("broadcast", ""); 

      try { 
       if (flagNotify.equalsIgnoreCase("broadcast1")) { 
        System.out.println("BraodCastReceiver Main Activity....................." + flagNotify); 

        // mToolbar.setNavigationIcon(R.drawable.navigation_drawerwithdot); 
        // mToolbar.setDrawerIndicatorEnabled(false); 
        // mToolbar.setHomeAsUpIndicator(R.drawable.navigation_drawerwithdot); 
        //mToolbar.setNavigationIcon(R.drawable.red_dot); 
        //toolBarImg.setImageResource(R.drawable.red_dot); 
        //toolBarImg.setVisibility(View.VISIBLE); 
       } else if (flagNotify.equalsIgnoreCase("FromNotice")) { 
        System.out.println("BraodCastReceiver From Notice...MainActivity" + flagNotify); 
        //  toolBarImg.setVisibility(View.VISIBLE); 
        // mToolbar.setNavigationIcon(R.drawable.navigation_drawer); 

        // MainActivity.this.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 


        // mToolbar.setLogo(R.drawable.plus_black); 
        // mToolbar.invalidate(); 
       /* ActionBar actionbar = getSupportActionBar(); 
        actionbar.setDisplayHomeAsUpEnabled(true); // Enable 
        actionbar.setHomeAsUpIndicator(R.drawable.plus);*/ 
        // toolBarImg.setImageResource(R.drawable.plus); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public String registerGCM() 
    { 

     gcm = GoogleCloudMessaging.getInstance(this); 
     regId = getRegistrationId(this); 

     if (TextUtils.isEmpty(regId)) { 

      registerInBackground(); 

      // Log.d("RegisterActivity", "registerGCM - successfully registered with GCM server - regId: "+ regId); 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "RegId already available. RegId: " + regId, 
        Toast.LENGTH_LONG).show(); 
     } 
     return regId; 
    } 

    private String getRegistrationId(Context context) { 
     final SharedPreferences prefs = getSharedPreferences(
       MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); 
     regId = prefs.getString(REG_ID, ""); 

     /* for (Iterator<String> it = registrationId.iterator(); it.hasNext();) { 
      regId = it.next(); 
      System.out.println("foo found"+regId); 
     }*/ 
     if (regId.isEmpty()) { 
      //Log.i(TAG, "Registration not found."); 
      return ""; 
     } 
     int registeredVersion = prefs.getInt(APP_VERSION, Integer.MIN_VALUE); 
     int currentVersion = getAppVersion(context); 
     if (registeredVersion != currentVersion) { 
      // Log.i(TAG, "App version changed."); 
      return ""; 
     } 
     return regId; 
    } 

    private static int getAppVersion(Context context) 
    { 
     try 
     { 
      PackageInfo packageInfo = context.getPackageManager() 
        .getPackageInfo(context.getPackageName(), 0); 
      return packageInfo.versionCode; 
     } 
     catch (PackageManager.NameNotFoundException e) 
     { 
      // Log.d("RegisterActivity", "I never expected this! Going down, going down!" + e); 
      throw new RuntimeException(e); 
     } 
    } 

    private void registerInBackground() { 
     new AsyncTask<Void, Void, String>() { 
      @Override 
      protected String doInBackground(Void... params) { 
       String msg = ""; 
       try { 
        if (gcm == null) { 
         gcm = GoogleCloudMessaging.getInstance(getApplicationContext()); 
        } 
        regId = gcm.register(Config.GOOGLE_PROJECT_ID); 

        // mylist.add(regId); //this adds an element to the list. 
        //Set<String> regIdSet = new HashSet<String>(mylist); 
        //Log.d("RegisterActivity", "registerInBackground - regId: " + regId); 
        msg = "Device registered, registration ID=" + regId; 
        System.out.println("Registration Id......InService"+regId); 
        storeRegistrationId(getApplicationContext(), regId); 
       } 
       catch (IOException ex) 
       { 
        msg = "Error :" + ex.getMessage(); 
        // Log.d("RegisterActivity", "Error: " + msg); 
       } 
       // Log.d("RegisterActivity", "AsyncTask completed: " + msg); 
       return msg; 
      } 

      @Override 
      protected void onPostExecute(String msg) { 
       Toast.makeText(getApplicationContext(), 
         "Registered with GCM Server." + msg, Toast.LENGTH_LONG) 
         .show(); 
      } 
     }.execute(null, null, null); 
    } 

    private void storeRegistrationId(Context context, String regId) { 
     final SharedPreferences prefs = getSharedPreferences(
       MainActivity.class.getSimpleName(), Context.MODE_PRIVATE); 
     int appVersion = getAppVersion(context); 
     // Log.i(TAG, "Saving regId on app version " + appVersion); 

     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString(REG_ID, regId); 
     editor.putInt(APP_VERSION, appVersion); 
     editor.commit(); 

     /* 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString(REG_ID, regId); 
     editor.putInt(APP_VERSION, appVersion); 
     editor.commit();*/ 
    } 
    public boolean isNetworkAvailable() 
    { 
     ConnectivityManager connectivityManager = (ConnectivityManager) 
       getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
     boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting(); 
     if (isConnected) 
      Log.i("NET", "connecte" + isConnected); 
     else Log.i("NET", "not connecte" +isConnected); 
     return isConnected; 
    } 

} 
    --------------------------------------------------------------- 
    package com.appiphy.virtualnoticeboard.notification; 

    import android.content.Context; 
    import android.os.StrictMode; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.net.HttpURLConnection; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.util.HashMap; 
    import java.util.Iterator; 
    import java.util.Map; 

    /** 
    * Created by emp005 on 23/3/16. 
    */ 
    public class ShareExternalServer 
    { 
     public String shareRegIdWithAppServer(final Context context, 
               final String regId) 
     { 

      String result = ""; 
      Map<String, String> paramsMap = new HashMap<String, String>(); 
      paramsMap.put("regId", regId); 
      removeNetworkOnMainThread(); 
     //  Boolean network=mainActivity.isNetworkAvailable(); 
     { 
       try { 
        URL serverUrl = null; 
        try { 
         //serverUrl = new URL(Config.APP_SERVER_URL); 
         serverUrl = new URL("http://192.168.1.207:8080/GCM-App-Server/GCMNotification?shareRegId=1"); 
        } catch (MalformedURLException e) { 
         // Log.e("AppUtil", "URL Connection Error: " + Config.APP_SERVER_URL, e); 
         result = "Invalid URL: " + Config.APP_SERVER_URL; 
         //System.out.println("App Server Url"+ Config.APP_SERVER_URL); 

        } 

        StringBuilder postBody = new StringBuilder(); 
        Iterator<Map.Entry<String, String>> iterator = paramsMap.entrySet() 
          .iterator(); 

        while (iterator.hasNext()) 
        { 
         Map.Entry<String, String> param = iterator.next(); 
         postBody.append(param.getKey()).append('=') 
           .append(param.getValue()); 
         if (iterator.hasNext()) 
         { 
          postBody.append('&'); 
         } 
        } 
        String body = postBody.toString(); 
        byte[] bytes = body.getBytes(); 
        HttpURLConnection httpCon = null; 
        try 
        { 
         httpCon = (HttpURLConnection) serverUrl.openConnection(); 
         httpCon.setDoOutput(true); 
         httpCon.setUseCaches(false); 
         httpCon.setFixedLengthStreamingMode(bytes.length); 
         httpCon.setRequestMethod("POST"); 
         httpCon.setRequestProperty("Content-Type", 
           "application/x-www-form-urlencoded;charset=UTF-8"); 
         OutputStream out = httpCon.getOutputStream(); 
         out.write(bytes); 
         out.close(); 
         // System.out.println("Bytes--------1-"+bytes); 
         int status = httpCon.getResponseCode(); 
         if (status == 200) 
         { 
          result = "RegId shared with Application Server. RegId: " 
            + regId; 
         } 
         else 
         { 
          result = "Post Failure." + " Status: " + status; 
         } 
        } 
        finally 
        { 
         if (httpCon != null) 
         { 
          httpCon.disconnect(); 
         } 
        } 

       } 
       catch (IOException e) 
       { 
        result = "Post Failure. Error in sharing with App Server."; 
        // Log.e("AppUtil", "Error in sharing with App Server: " + e); 
       } 
      } 

       return result; 

     } 
     public void removeNetworkOnMainThread() 
     { 
      // To remove Network on main thread exception 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
     } 

    } 

В MainActivity регистров с GCM сервером и отправляет IntentServiceRegId на сервер. Wi-Fi Push Notification работает хорошо, но при работе в сети 3G экран MainActivity выглядит как пустой экран и переходит в состояние ожидания. Я потратил на это много часов, но не получил никакого решения.Push уведомление не работает на 3G мобильной сети

+1

plz посмотреть эту ссылку http://stackoverflow.com/questions/39763498/afnetworking-is-not-working-when-device-is-on-3g-network-but-its-working-when-th/39763684 # 39763684 –

+0

проверьте эту ссылку или добавьте свои данные файла манифеста в свой вопрос. – Madhur

+0

Попробуйте 'registerGCM' в фоновом потоке. Проблема может заключаться в том, что ваша 3g-сеть слишком медленная, и вы общаетесь с gcm-сервером в своем основном потоке. Таким образом, код застрял и продолжает ждать ответа вашего 'getRegistrationId()'. –

ответ

0

Вы пробовали тестировать его на другом устройстве с различными версиями Android? Это может быть проблемой с версией оборудования или API. Также проверьте, установлено ли значение delayWhileIdle в true. Если это так, это приведет к задержке доставки до тех пор, пока ваше устройство снова не включится. [Source.]

Если это не поможет, воспользуйтесь этим способом SO thread.

Когда вы посылаете толчок уведомление от сервера убедитесь, что НЕ включают delay_while_idle, поэтому уведомление доставлено сразу. Также убедитесь, что вы установили time_to_live на разумное значение (по умолчанию - 4 недели).

+0

это не важно, но сервер не получает RegId, что является проблемой –

Смежные вопросы