2016-07-27 87 views
0

我試圖從MainActivity中設置一個值,並將其設置爲FirebaseInstance類。在Android Studio中獲取和設置Firebase實例的值

,但我得到這個錯誤,

Process: com.administrator.mosbeau, PID: 17713 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.administrator.mosbeau/com.example.administrator.mosbeau.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.administrator.mosbeau.FirebaseSetGet.setCountryid(java.lang.String)' on a null object reference 

這裏就是我所做的。

我創建了一個FirebaseSetGet

public class FirebaseSetGet extends Application { 

    private String countryid; 
    private String customerid; 


    public String getCountryid() { 

     return countryid; 
    } 

    public void setCountryid(String acountryid) { 

     countryid = acountryid; 

    } 

    public String getCustomerid() { 

     return customerid; 
    } 

    public void setCustomerid(String acustomerid) { 

     customerid = acustomerid; 
    } 

} 

那我就在我的MainActivity中添加此代碼。

private void displayUserDetails() { 
    User user = userLocalStore.getLoggedInUser(); 

    customersid = user.customers_id; 
    countrycode = user.customers_countryid; 
    stateid = user.customers_stateid; 

    if (customersid == "") { 
     Intent myIntent = new Intent(MainActivity.this, IndexActivity.class); 
     startActivity(myIntent); 
    } 

    if (checkPlayServices()) { 
     idsvar.setCountryid(countrycode); 
     idsvar.setCustomerid(customersid); 
     FirebaseMessaging.getInstance().subscribeToTopic("test"); 
     FirebaseInstanceId.getInstance().getToken(); 
    } else { 
     Log.i(TAG, "No valid Google Play Services APK found."); 
    } 

    if (productId != null){ 
     if (productFragment != null) { 
      if (productFragment.equals("productItem")) { 
       ProductFragment productfragment = ProductFragment.newInstance(productId, productName, countrycode, customersid, categoryName, stateid, categoryId); 
       FragmentManager fragmentManager = getFragmentManager(); 
       fragmentManager.beginTransaction() 
         .replace(R.id.container, productfragment) 
         .addToBackStack(null) 
         .commit(); 
      } 
     } 
    } 
} 

然後讓我的FirebaseInstance

public class FirebaseInstanceIDService extends FirebaseInstanceIdService { 

    FirebaseSetGet idsvar = new FirebaseSetGet(); 

    @Override 
    public void onTokenRefresh() { 

     String token = FirebaseInstanceId.getInstance().getToken(); 

     final String country_id = idsvar.getCountryid(); 
     final String customer_id = idsvar.getCustomerid(); 

     registerToken(token,country_id,customer_id); 
    } 

    private void registerToken(String token, String country_id, String customer_id) { 

     OkHttpClient client = new OkHttpClient(); 
     RequestBody body = new FormBody.Builder() 
       .add("Token",token) 
       .add("Countryid",country_id) 
       .add("Customerid",customer_id) 
       .build(); 

     Request request = new Request.Builder() 
       .url("http://shop.mosbeau.com.ph/FCM/register.php") 
       .post(body) 
       .build(); 

     try { 
      client.newCall(request).execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

,但它給我的錯誤。

回答

1

我相信,將值傳遞給FirebaseInstanceIdService將是一個不好的方法。

爲什麼不玩SharedPreferences

當令牌被刷新,只是除下文偏好令牌:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 
    private static final String TAG = "MyFirebaseIIDService"; 

    @Override 
    public void onTokenRefresh() { 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

     sendRegistrationToServer(refreshedToken); 
    } 

    private void sendRegistrationToServer(String token) { 
     SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token); 
    } 
} 

此後,我在我的BaseActivity創建一個方法來獲得從偏好低於令牌:

public String getDeviceToken() { 
    return SharedPreferenceUtils 
      .getInstance(this) 
      .getStringValue(getString(R.string.firebase_cloud_messaging_token), "").equals("") 
      ? FirebaseInstanceId.getInstance().getToken() 
      : SharedPreferenceUtils.getInstance(this).getStringValue(getString(R.string.firebase_cloud_messaging_token), ""); 
} 

因此,通過這種方式,我將新生成的標記存儲在首選項中,並創建了一個訪問它的全局點以供稍後使用。

你可以走這條路。詢問你是否需要更多的通關..

編輯:它是一個實用工具類,我們已創建使用SharedPreferences輕鬆工作。

你可以從Github Gist得到它。

+0

嗨Chintan,謝謝你的幫助..對不起,即時通訊新的android ..你能幫助莫構建我的代碼?我更新我的代碼..謝謝..我試過你的代碼,但即時獲取SharedPreferenceUtils錯誤。 – Joehamir

+0

@Joehamir更新回答。請檢查。 –

+0

無法解析符號firebase_cloud_messaging_token – Joehamir

0

FirebaseSetGet類的對象不首先初始化初始化

FirebaseSetGet idsvar = new FirebaseSetGet(); 

現在你可以調用FirebaseSetGet類的方法。

+0

同意sumit –

+0

不工作..是否有可能將值從MainActivity傳遞給FirebaseInstanceIdService? – Joehamir

+0

請參閱編輯。我更新了我的FirebaseInstanceIDService代碼。 – Joehamir