Java Android GCM注册id返回默认值
背景 我正在将GCM服务合并到我的应用程序中。ClientActivity.java调用方法Java Android GCM注册id返回默认值,java,android,android-asynctask,google-cloud-messaging,Java,Android,Android Asynctask,Google Cloud Messaging,背景 我正在将GCM服务合并到我的应用程序中。ClientActivity.java调用方法getGcmToken(),该方法获取注册id并将其存储在SharedReferences中。所有这些都发生在后台。然后使用volley将注册id保存在数据库中。代码如下所示 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV
getGcmToken()
,该方法获取注册id并将其存储在SharedReferences中。所有这些都发生在后台。然后使用volley将注册id保存在数据库中。代码如下所示
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
SharedPreferences appPrefs=mContext.getSharedPreferences("gcm",Context.MODE_PRIVATE);
String token=appPrefs.getString(GCM_TOKEN,"");
//if starts
if(token.isEmpty()){
try{
getGCMToken();
StringRequest stringRequest=new StringRequest(Request.Method.POST, REGISTRATIONID_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject value=new JSONObject(response);
String message=value.getString("message");
Toast.makeText(ClientActivity.this,message,Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(ClientActivity.this,error.toString(),Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String,String> getParams()throws AuthFailureError {
Map<String,String> map=new HashMap<String,String>();
SharedPreferences sharedPrefs=getSharedPreferences("api_key",Context.MODE_PRIVATE);
String api_key=sharedPrefs.getString("api_key", "");
Log.i("out88", api_key);
map.put(KEY_APIKEY, api_key);
SharedPreferences appPrefs=getSharedPreferences("gcm",Context.MODE_PRIVATE);
String reg_id=appPrefs.getString(GCM_TOKEN,"default");
**Log.i("reg",reg_id);------>this statement**
map.put(KEY_REGID, reg_id);
return map;
}
};
RequestQueue requestQueue= Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}catch(Exception e){
e.printStackTrace();
}
}//if ends
mTextView=(TextView)findViewById(R.id.textView2);
}
private void getGCMToken(){
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try{
InstanceID instanceID=InstanceID.getInstance(mContext);
String token=instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE,null);
if(token!=null&&token.isEmpty()){
SharedPreferences appPrefs=mContext.getSharedPreferences("gcm",Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor=appPrefs.edit();
prefsEditor.putString(GCM_TOKEN, token);
prefsEditor.apply();
}
Log.i("GCM",token);----->this statement
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u客户端);
SharedReferences appPrefs=mContext.getSharedReferences(“gcm”,Context.MODE\u PRIVATE);
String token=appPrefs.getString(GCM_token,“”);
//如果开始
if(token.isEmpty()){
试一试{
getGCMToken();
StringRequest StringRequest=新的StringRequest(Request.Method.POST,REGISTRATIONID\u URL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
试一试{
JSONObject值=新JSONObject(响应);
字符串消息=value.getString(“消息”);
Toast.makeText(ClientActivity.this、message、Toast.LENGTH_LONG.show();
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(ClientActivity.this,error.toString(),Toast.LENGTH_LONG.show();
}
}){
@凌驾
受保护的映射getParams()引发AuthFailureError{
Map Map=newhashmap();
SharedReferences SharedReferences=GetSharedReferences(“api_密钥”,Context.MODE_PRIVATE);
String api_key=sharedPrefs.getString(“api_key”,”);
Log.i(“out88”,api_密钥);
map.put(KEY\u APIKEY,api\u KEY);
SharedReferences appPrefs=GetSharedReferences(“gcm”,Context.MODE\u PRIVATE);
String reg_id=appPrefs.getString(GCM_标记,“默认”);
**Log.i(“reg”,reg_id);------>此语句**
地图放置(注册表项、注册表id);
返回图;
}
};
RequestQueue RequestQueue=Volley.newRequestQueue(this);
添加(stringRequest);
}捕获(例外e){
e、 printStackTrace();
}
}//如果结束
mTextView=(TextView)findViewById(R.id.textView2);
}
私有void getGCMToken(){
新建异步任务(){
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
InstanceID InstanceID=InstanceID.getInstance(mContext);
String token=instanceID.getToken(发送方ID,GoogleCloudMessaging.INSTANCE ID,作用域,null);
if(token!=null&&token.isEmpty()){
SharedReferences appPrefs=mContext.getSharedReferences(“gcm”,Context.MODE\u PRIVATE);
SharedReferences.Editor prefsEditor=appPrefs.edit();
prefsEditor.putString(GCM_令牌,令牌);
prefsEditor.apply();
}
Log.i(“GCM”,token);----->此语句
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}.execute();
}
}
问题
行Log.i(“GCM”,令牌)代码>打印类似e2DgrsZPGKU的注册令牌:APA91bF_73a6-o5CLV-gdcZzYFAbtikJqi-5w6gDSCaRa4z8-1iGLeV5SS6hQkW8pj_g_DXBE7JLDSOPMGU3Y1GKW1VPN_ZewiecwBSITPD0PLWAZ50W8UZKNGHVNF1XXXXXX
所以我假设它是正确的注册id。但当我从共享首选项文件检索它时,它返回默认值并将其存储在数据库中
只打印默认值。在doInBackground()
中,if语句中的条件是错误的。应该是:
if (token!=null && !token.isEmpty())
不起作用。另外,语句
Log.i(“reg”,reg\u id)
打印“default”证明它正在输入if语句。我想在String reg\u id=appPrefs.getString(GCM\u TOKEN,“default”)
或类似的内容之后执行doInBackground,if语句中没有Log
语句Log.i(“GCM”,token)
在if语句之外。在if语句中添加Log
语句,以确认令牌存储在首选项中。Log语句是覆盖映射的地方。我指出了这一点。您是否同意当instanceID.getToken()
返回一个有效的令牌时,您在代码中显示的if语句将阻止令牌存储在首选项中,因为token.isEmpty()
返回false?很抱歉,您误解了。我的if语句不正确。谢谢您的帮助!