遇到问题与Android的

遇到问题与Android的

问题描述:

再次发送通知到发件人确认我在Android的新的和我工作的一个Android项目,其中发送通知的是,项目的功能。每一件事情都能正常工作,通知已经成功发送和接收,当用户收到通知后,它会打开一个对话框在对话框中,有两个选项接受或拒绝,当用户接受时向用户发送确认,但确认在接收器设备而不是发送器设备上接收。我认为它的REG ID的问题遇到问题与Android的

对我的代码来看看

主要活动

public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener { 

private GoogleCloudMessaging gcm; 
static String regid; 
CheckBox isdriver; 
HttpPost httppost; 
StringBuffer buffer; 
HttpResponse response; 
HttpClient httpclient; 
List<NameValuePair> nameValuePairs; 
String user_name = ""; 
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
String TAG = "MainActivity"; 
String SENDER_ID = "224163385438"; 
String API_KEY = "AIzaSyCL3REK_ONEgLdhcP8giso_5P6xWE3gUvA"; 
static Utils utils; 
private Context context = MainActivity.this; 
private ProgressDialog pb; 
private EditText username; 
String sender_regid; 
private ArrayList<PeopleObject> peopleObjList; 
ListView list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    BookingActivity book = new BookingActivity(); 
    registerReceiver(book.broadcastReceiver, new IntentFilter(
      "CHAT_MESSAGE_RECEIVED")); 
    super.onCreate(savedInstanceState); 
    utils = new Utils(this); 
    startRegistration(); 
    isdriver = (CheckBox) findViewById(R.id.isDriver); 
    list = new ListView(this); 

    if (utils.getFromPreferences(Utils.UserName).isEmpty()) { 
     setContentView(R.layout.activity_main); 

    } else { 

     setPeopleList(); 

    } 

} 

void setPeopleList() { 


    setSupportProgressBarIndeterminate(true); 
    setContentView(list); 
    getPeopleList(); 

    list.setOnItemClickListener(this); 

} 

private void registerInBackground() { 

    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 
      try { 
       if (gcm == null) { 
        gcm = GoogleCloudMessaging.getInstance(context); 
       } 
       regid = gcm.register(SENDER_ID); 
       msg = "Device registered, registration ID=" + regid; 
       utils.saveregid("regid_sender",regid); 

      } catch (IOException ex) { 
       msg = ex.getMessage(); 
      } 
      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) { 
      Log.i(TAG, "onPostExecute : " + msg); 

      if (!msg.equalsIgnoreCase("SERVICE_NOT_AVAILABLE")) { 

       Message msgObj = handler.obtainMessage(); 
       Bundle b = new Bundle(); 
       b.putString("server_response", msg); 
       msgObj.setData(b); 
       handler.sendMessage(msgObj); 

      } else { 

       utils.showToast("Error : " + msg 
         + "\nPlease check your internet connection"); 

       hidePB(); 

      } 
     } 

     // Define the Handler that receives messages from the thread and 
     // update the progress 
     private final Handler handler = new Handler() { 

      public void handleMessage(Message msg) { 

       String aResponse = msg.getData().getString(
         "server_response"); 

       if ((null != aResponse)) { 

        Log.i(TAG, " sendRegistrationIdToBackend();"); 

        sendRegistrationIdToBackend(); 

       } else { 

       } 

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

/** 
* Sends the registration ID to your server over HTTP, so it can use 
* GCM/HTTP or CCS to send messages to your app. Not needed for this demo 
* since the device sends upstream messages to a server that echoes back the 
* message using the 'from' address in the message. 
*/ 
public void sendRegistrationIdToBackend() { 

    Log.i(TAG, "sendRegistrationIdToBackend"); 

    Thread thread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       httpclient = new DefaultHttpClient(); 

       // yahan reg id ki server webserivcice dalegi 

       httppost = new HttpPost("http://www.test5.luminativesolutions.com/cabbooking/ws/gcmdemo/save_reg_id.php"); 
       nameValuePairs = new ArrayList<NameValuePair>(1); 
       nameValuePairs.add(new BasicNameValuePair("username", 
         user_name)); 
       nameValuePairs.add(new BasicNameValuePair("reg_id", regid)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
       final String response = httpclient.execute(httppost, 
         responseHandler); 
       Log.i(TAG, "Response : " + response); 

       if (response != null) { 

        if (response 
          .equalsIgnoreCase("Username already registered")) { 

         utils.showToast("Username already registered"); 
         utils.savePreferences("regid_sender",regid); 

         hidePB(); 



        } else { 
         if (response 
           .equalsIgnoreCase("New Device Registered successfully")) { 

          utils.savePreferences(Utils.UserName, user_name); 
          // Persist the regID - no need to register 
          // again. 
          utils.savePreferences("regid_sender", regid); 



          utils.showToast("Device registration successful"); 

          runOnUiThread(new Runnable() { 
           public void run() { 

            setPeopleList(); 
           } 
          }); 

         } 
        } 


       } 

      } catch (Exception e) { 

       hidePB(); 
       Log.d(TAG, "Exception : " + e.getMessage()); 
      } 
     } 
    }; 

    thread.start(); 

} 

void getPeopleList() { 

    hidePB(); 
    showPB("Getting People to Chat..."); 

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

      String response = ""; 

      try { 

       httpclient = new DefaultHttpClient(); 
       httppost = new HttpPost("http://www.test5.luminativesolutions.com/cabbooking/ws/gcmdemo/get_people_list.php"); 
       nameValuePairs = new ArrayList<NameValuePair>(1); 
       nameValuePairs.add(new BasicNameValuePair("username", 
         utils.getFromPreferences(Utils.UserName))); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
       response = httpclient.execute(httppost, responseHandler); 
       Log.i(TAG, "USER :" + utils.getFromPreferences(Utils.UserName)); 
       Log.i(TAG, "Response : " + response); 

      } catch (Exception ex) { 

       Log.d(TAG, "Error : " + ex.getMessage()); 

       runOnUiThread(new Runnable() { 
        public void run() { 
         utils.showToast("Server Not responding, Please check whether your server is running or not"); 
        } 
       }); 

      } 

      return response; 
     } 

     @Override 
     protected void onPostExecute(String response) { 

      if (!response.equalsIgnoreCase("No People")) { 
       peopleObjList = new ArrayList<PeopleObject>(); 
       // parse JSON here 

       try { 
        JSONArray jArray = new JSONArray(response); 

        for (int j = 0; j < jArray.length(); j++) { 

         JSONObject jsonObj = jArray.getJSONObject(j); 
         String username = jsonObj.getString("username"); 
         String reg_id = jsonObj.getString("reg_id"); 

         PeopleObject p = new PeopleObject(); 
         p.setPersonName(username); 
         p.setRegId(reg_id); 
         peopleObjList.add(p); 

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

       if (peopleObjList.size() > 0) { 

        Message msgObj = handler.obtainMessage(); 
        Bundle b = new Bundle(); 
        b.putSerializable("people_list", 
          (Serializable) peopleObjList); 
        msgObj.setData(b); 
        handler.sendMessage(msgObj); 

       } 
      } else { 
       hidePB(); 
       utils.showToast("No People registered for Chat..."); 
      } 

     } 

     // Define the Handler that receives messages from the thread and 
     // update the progress 
     private final Handler handler = new Handler() { 

      public void handleMessage(Message msg) { 

       @SuppressWarnings("unchecked") 
       ArrayList<PeopleObject> peopleList = (ArrayList<PeopleObject>) msg 
         .getData().getSerializable("people_list"); 

       if (peopleList.size() > 0) { 

        ArrayAdapter<PeopleObject> adapter = new ListAdapter(
          MainActivity.this, peopleList); 
        list.setAdapter(adapter); 

       } else { 

       } 

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

void startRegistration() { 

    if (checkPlayServices()) { 
     // If this check succeeds, proceed with normal processing. 
     // Otherwise, prompt user to get valid Play Services APK. 
     Log.i(TAG, "Google Play Services OK"); 
     gcm = GoogleCloudMessaging.getInstance(this); 
     regid = utils.getRegistrationId(); 
     utils.saveregid("regid_sender",regid); 
     /*if(isdriver.isChecked()){ 
      utils.savePreferences(user_name, regid); 
      Log.d(TAG,utils.getFromPreferences(user_name)); 
     }*/ 
     System.out.println(regid); 
     if (regid.isEmpty()) { 
      registerInBackground(); 
     } else { 
      Log.i(TAG, "Reg ID Not Empty"); 
     } 
    } else { 
     Log.i(TAG, "No valid Google Play Services APK found."); 
    } 

} 

private boolean checkPlayServices() { 
    int resultCode = GooglePlayServicesUtil 
      .isGooglePlayServicesAvailable(this); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { 
      Log.i(TAG, "No Google Play Services...Get it from the store."); 
      GooglePlayServicesUtil.getErrorDialog(resultCode, this, 
        PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
     } else { 
      Log.i(TAG, "This device is not supported."); 
      finish(); 
     } 
     return false; 
    } 
    return true; 
} 

void showPB(final String message) { 

    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      pb = new ProgressDialog(MainActivity.this); 
      pb.setMessage(message); 
      pb.show(); 
     } 
    }); 

} 

void hidePB() { 

    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      if (pb != null && pb.isShowing()) 
       pb.dismiss(); 
     } 
    }); 

} 

public void onClick(View view) { 

    if (view.getId() == R.id.btnsave) { 
     username = (EditText) findViewById(R.id.username); 
     user_name = username.getText().toString().trim(); 
     utils.savePreferences("username",user_name); 
     if (user_name.length() > 0) { 

      Log.d(TAG, "startRegistration"); 

      showPB("Registering the device"); 

      startRegistration(); 

     } else { 

      Log.d(TAG, "Username empty"); 

     } 
    } 
} 
} 

预订活动

public class BookingActivity extends ActionBarActivity { 

HttpPost httppost; 
StringBuffer buffer; 
HttpResponse response; 
HttpClient httpclient; 
List<NameValuePair> nameValuePairs; 
Utils utils; 
Intent i; 
static String TAG = "GCM DEMO"; 
String user_name; 
String regid; 

String SENDER_ID = "224163385438"; 
String API_KEY = "AIzaSyCL3REK_ONEgLdhcP8giso_5P6xWE3gUvA"; 



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

    i = getIntent(); 

    registerReceiver(broadcastReceiver, new IntentFilter(
      "CHAT_MESSAGE_RECEIVED")); 
} 

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     Bundle b = intent.getExtras(); 

     String message = b.getString("message"); 

     //Log.i(TAG, " Received in Activity " + message + ", NAME = " 
      //  + i.getStringExtra("username")); 


    } 
}; 

public void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(broadcastReceiver); 
} 

public void onClick(final View view) { 

    if (view == findViewById(R.id.booking)) { 

     sendMessage(); 

     // startActivity(new Intent(BookingActivity.this,NotificationDailog.class)); 
     //clearMessageTextBox(); 

    } 

} 

public void sendMessage() { 

    final String messageToSend = "Driver you are now booked by: "+i.getStringExtra("username"); 

    if (messageToSend.length() > 0) { 

     Log.i(TAG, "sendMessage"); 

     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        httpclient = new DefaultHttpClient(); 
        httppost = new 
          HttpPost("http://www.test5.luminativesolutions.com/cabbooking/ws/gcmdemo/gcm_engine.php"); 
        nameValuePairs = new ArrayList<NameValuePair>(1); 
        nameValuePairs.add(new BasicNameValuePair("message", 
          messageToSend)); 
        nameValuePairs.add(new BasicNameValuePair(
          "registrationIDs", i.getStringExtra("regid"))); 
        nameValuePairs.add(new BasicNameValuePair("apiKey", 
          API_KEY)); 
        httppost.setEntity(new UrlEncodedFormEntity(
          nameValuePairs)); 
        ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
        final String response = httpclient.execute(httppost, 
          responseHandler); 
        Log.i(TAG, "Response : " + response); 
        if (response.trim().isEmpty()) { 
         Log.d(TAG, "Message Not Sent"); 
        } 

       } catch (Exception e) { 
        Log.d(TAG, "Exception : " + e.getMessage()); 
       } 
      } 
     }; 

     thread.start(); 

    } 

} 
} 

通知对话框活动

public class NotificationDailog extends ActionBarActivity { 


private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
String SENDER_ID = "224163385438"; 
String API_KEY = "AIzaSyCL3REK_ONEgLdhcP8giso_5P6xWE3gUvA"; 
private String regid; 
private DefaultHttpClient httpclient; 
private ArrayList<NameValuePair> nameValuePairs; 
private HttpPost httppost; 
private String TAG = "GCM Demo"; 
private Utils utils; 
private GoogleCloudMessaging gcm; 
private Context context = this; 
private ProgressDialog pb; 
private String regid_sender; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    utils = new Utils(this); 
    regid_sender = utils.getregid("regid_sender"); 
    //regid_sender = BookingActivity.getregid(); 
    setContentView(R.layout.activity_notification_dailog); 
    BookingActivity booking = new BookingActivity(); 
    registerReceiver(booking.broadcastReceiver, new IntentFilter(
      "CHAT_MESSAGE_RECEIVED")); 
} 


public void Accept(View view) { 


    //startRegistration(); 
    //getPeopleList(); 
    sendMessage(); 
    finish(); 
} 

public void sendMessage() { 

    final String messageToSend = "Driver Accepted your request"; 

    if (messageToSend.length() > 0) { 

     Log.i(TAG, "sendMessage"); 

     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        httpclient = new DefaultHttpClient(); 
        httppost = new 
          HttpPost("http://www.test5.luminativesolutions.com/cabbooking/ws/gcmdemo/gcm_engine.php"); 
        nameValuePairs = new ArrayList<NameValuePair>(1); 
        nameValuePairs.add(new BasicNameValuePair("message", 
          messageToSend)); 
        nameValuePairs.add(new BasicNameValuePair(
          "registrationIDs", regid_sender)); 
        nameValuePairs.add(new BasicNameValuePair("apiKey", 
          API_KEY)); 

        httppost.setEntity(new UrlEncodedFormEntity(
          nameValuePairs)); 
        ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
        final String response = httpclient.execute(httppost, 
          responseHandler); 
        Log.i(TAG, "Response : " + response); 
        if (response.trim().isEmpty()) { 
         Log.d(TAG, "Message Not Sent"); 
        } 

       } catch (Exception e) { 
        Log.d(TAG, "Exception : " + e.getMessage()); 
       } 
      } 
     }; 

     thread.start(); 

    } 
} 

void showPB(final String message) { 

    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      pb = new ProgressDialog(NotificationDailog.this); 
      pb.setMessage(message); 
      pb.show(); 
     } 
    }); 

} 

void hidePB() { 

    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      if (pb != null && pb.isShowing()) 
       pb.dismiss(); 
     } 
    }); 

} 

@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_notification_dailog, 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(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

您从GCM服务获得的确认只会告诉您GCM服务已收到该消息,无论其是否被传送到应用程序。即使安装应用程序的设备已关闭,您也可以得到它。

如果你想获得当消息被传递到应用程序的确认,必须从您的应用程序时,其收到的消息打电话给你的服务器。您可以在消息中包含一些唯一标识符,并将该标识符从应用程序发送到服务器以确认传送。

下面是与确认相关的堆栈溢出标签:Client(android application) acks for sent gcm messages