Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GCM推送通知不工作,并且寄存器id也不显示_Java_Android_Jsp - Fatal编程技术网

Java GCM推送通知不工作,并且寄存器id也不显示

Java 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

我已经为GCM编写了一个程序来注册并将注册的id共享给一个新的活动,但不幸的是,当我单击register按钮时,我的注册id本身并没有显示出来,当我单击jsp页面上的send push notification按钮时,它会抛出一个错误,显示文件未找到异常GCMRegId.txt。如果有人能建议我对以下代码所做的更改,那将是非常有帮助的

GCMNotification.java

@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;
    }