Java GCM推送通知不工作,并且寄存器id也不显示
我已经为GCM编写了一个程序来注册并将注册的id共享给一个新的活动,但不幸的是,当我单击register按钮时,我的注册id本身并没有显示出来,当我单击jsp页面上的send push notification按钮时,它会抛出一个错误,显示文件未找到异常GCMRegId.txt。如果有人能建议我对以下代码所做的更改,那将是非常有帮助的 GCMNotification.javaJava GCM推送通知不工作,并且寄存器id也不显示,java,android,jsp,Java,Android,Jsp,我已经为GCM编写了一个程序来注册并将注册的id共享给一个新的活动,但不幸的是,当我单击register按钮时,我的注册id本身并没有显示出来,当我单击jsp页面上的send push notification按钮时,它会抛出一个错误,显示文件未找到异常GCMRegId.txt。如果有人能建议我对以下代码所做的更改,那将是非常有帮助的 GCMNotification.java @WebServlet("/GCMNotification") public class GCMNotification
@WebServlet("/GCMNotification")
public class GCMNotification extends HttpServlet {
private static final long serialVersionUID = 1L;
// Put your Google API Server Key here
private static final String GOOGLE_SERVER_KEY = "Server Key";
static final String MESSAGE_KEY = "message";
public GCMNotification() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException,
IOException {
Result result = null;
String share = request.getParameter("shareRegId");
// GCM RedgId of Android device to send push notification
String regId = "";
if (share != null && !share.isEmpty()) {
regId = request.getParameter("regId");
PrintWriter writer = new PrintWriter("GCMRegId.txt");
writer.println(regId);
writer.close();
request.setAttribute("pushStatus", "GCM RegId Received.");
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
try {
BufferedReader br = new BufferedReader(new FileReader("GCMRegId.txt"));
regId = br.readLine();
br.close();
String userMessage = request.getParameter("message");
Sender sender = new Sender(GOOGLE_SERVER_KEY);
Message message = new Message.Builder().timeToLive(30).delayWhileIdle(true)
.addData(MESSAGE_KEY, userMessage).build();
System.out.println("regId: " + regId);
result = sender.send(message, regId, 1);
request.setAttribute("pushStatus", result.toString());
} catch (IOException ioe) {
ioe.printStackTrace();
request.setAttribute("pushStatus", "RegId required: " + ioe.toString());
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("pushStatus", e.toString());
}
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
RegistrationActivity.java有两个按钮,一个用于注册,另一个用于共享,在register按钮上我放了一个祝酒词,但当我单击它时,它显示RegId为:,没有显示RegId,当我单击share按钮时,它显示RegId为空
gcmnotificationtentservice.java
public class GCMNotificationIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public GCMNotificationIntentService() {
super("GcmIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
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());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
for (int i = 0; i < 3; i++) {
// Log.i(TAG, "Working... " + (i + 1) + "/5 @ " +
// SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
// Log.i(TAG, "Completed work @ " +
// SystemClock.elapsedRealtime());
sendNotification("Message Received from Google GCM Server: " +
extras.get(Config.MESSAGE_KEY));
// Log.i(TAG, "Received: " + extras.toString());
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg) {
// Log.d(TAG, "Preparing to send notification...: " + msg);
mNotificationManager = (NotificationManager)
this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this,
Service_Access.class), 0);
NotificationCompat.Builder mBuilder = new
NotificationCompat.Builder(this).setSmallIcon(R.drawable.gcm_logo)
.setContentTitle("GCM Notification").setStyle(new
NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
// Log.d(TAG, "Notification sent successfully.");
}
当我从index.jsp页面单击通过GCM发送的按钮推送通知时,它显示的就是这个错误
java.io.FileNotFoundException:GCMRegId.txt系统找不到指定的文件
在java.io.FileInputStream.openNative方法中
位于java.io.FileInputStream.Unknown Source
位于java.io.FileInputStream.Unknown Source
位于java.io.FileReader.Unknown Source
在com.android.d_governance.GCMNotification.doPostGCMNotification.java:55
位于javax.servlet.http.HttpServlet.serviceHttpServlet.java:646
位于javax.servlet.http.HttpServlet.serviceHttpServlet.java:727
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:303
位于org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208
位于org.apache.tomcat.websocket.server.WsFilter.doFilterWsFilter.java:52
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:241
位于org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208
位于org.apache.catalina.core.StandardWrapperValve.invokeStandardWrapperValve.java:220
位于org.apache.catalina.core.StandardContextValve.invokeStandardContextValve.java:122
位于org.apache.catalina.authenticator.AuthenticatorBase.invokeAuthenticatorBase.java:501
位于org.apache.catalina.core.StandardHostValve.invokeStandardHostValve.java:170
位于org.apache.catalina.valves.ErrorReportValve.invokeErrorReportValve.java:98
位于org.apache.catalina.valves.AccessLogValve.invokeAccessLogValve.java:950
位于org.apache.catalina.core.StandardEngineValve.invokeStandardenginievalve.java:116
位于org.apache.catalina.connector.CoyoteAdapter.serviceCoyoteAdapter.java:408
位于org.apache.coyote.http11.AbstractHttp11Processor.processAbstractHttp11Processor.java:1040
位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.processAbstractProtocol.java:607
位于org.apache.tomcat.util.net.aprependpoint$SocketProcessor.doRunAprEndpoint.java:2441
位于org.apache.tomcat.util.net.apredpoint$SocketProcessor.runapredpoint.java:2430
位于java.util.concurrent.ThreadPoolExecutor.runWorkerUnknown源
位于java.util.concurrent.ThreadPoolExecutor$Worker.runUnknown Source
位于java.lang.Thread.runUnknown Source
我的日志:
01-12 12:05:07.765:D/RegisterActivity20445:registerGCM-已成功向GCM服务器注册-regId:
01-12:05:07.765:D/注册活动20445:GCM注册:
没有GCM RegId出现
请在显示我的注册表时需要一些帮助
谢谢使用此方法而不是getRegistrationId
private String getRegistrationId(Context context)
{
final SharedPreferences prefs = getSharedPreferences(MainActivity.class.getSimpleName(), Context.MODE_PRIVATE);
String registrationId = prefs.getString(REG_ID, "");
if (registrationId=="")
{
registerInBackground();
}
else
{
Toast.makeText(getApplicationContext(),"RegId already available. RegId: " + registrationId, Toast.LENGTH_SHORT).show();
}
int registeredVersion = prefs.getInt(APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion)
{
return "";
}
return registrationId;
}
你能发布异常堆栈跟踪吗?@shyam我已经用logcat更新了我的问题,它显示的错误就我所知,你还没有将注册的GCM ID从android应用程序发送到你的应用程序服务器,是吗?是的,先生,但要发送我的注册码,它至少应该显示在我的toast消息中,我还调试并检查了,我的regid返回null,您可以在这里检查,先生,这是参考,我已经实现了相同的,我总是收到一个错误,说文件未找到异常,GCMRegId.txt未找到,怎么办?Arjun-您需要使用GCM regid的实际值,而不仅仅是关键字regid。所以RegID是4K字节的字母数字值
public interface Config {
// GCM server using java
static final String APP_SERVER_URL = "http://192.168.1.17:8081/GCM-App-Server/GCMNotification?
shareRegId=1";
// Google Project Number
static final String GOOGLE_PROJECT_ID = "167543534432";
static final String MESSAGE_KEY = "message";
}
private String getRegistrationId(Context context)
{
final SharedPreferences prefs = getSharedPreferences(MainActivity.class.getSimpleName(), Context.MODE_PRIVATE);
String registrationId = prefs.getString(REG_ID, "");
if (registrationId=="")
{
registerInBackground();
}
else
{
Toast.makeText(getApplicationContext(),"RegId already available. RegId: " + registrationId, Toast.LENGTH_SHORT).show();
}
int registeredVersion = prefs.getInt(APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion)
{
return "";
}
return registrationId;
}