android - फायरबेस(FCM) टोकन कैसे प्राप्त करें




firebase firebase-cloud-messaging (11)

सबसे बड़ी और अच्छे व्यक्ति के लिए

त्वरित समाधान इसे शेअरप्रेफ़्फ़्स में संग्रहीत करना है और इस तर्क को अपने मेनऐक्टिविटी या क्लास में ऑनक्रिएट विधि में जोड़ना है जो अनुप्रयोग का विस्तार कर रहा है।

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken", newToken);
    getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply();
});

Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));

सफाई का रास्ता

एक बेहतर विकल्प एक सेवा बनाना और एक समान तर्क के अंदर रखना है। सबसे पहले नई सर्विस बनाएं

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("newToken", s);
        getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }

    public static String getToken(Context context) {
        return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty");
    }
}

और फिर इसे AndroidManifest फ़ाइल में जोड़ें

<service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
</service>

अंत में, आप अपनी सेवा MyFirebaseMessagingService.getToken(Context); से एक स्थिर विधि का उपयोग करने में सक्षम हैं MyFirebaseMessagingService.getToken(Context);

सबसे तेजी से काट दिया

Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());

यह तब भी काम कर रहा है जब आप संस्करण 17.xx की तुलना में पुराने फायरबेस लाइब्रेरी का उपयोग कर रहे हैं

यह मेरी पहली FCM का उपयोग करने के लिए है।

मैं firebase/quickstart-android से एक नमूना डाउनलोड करता हूं और मैं एफसीएम क्विकस्टार्ट स्थापित करता हूं। लेकिन मैं लॉग से कोई टोकन प्राप्त नहीं कर सकता, यहां तक ​​कि ऐप में लॉग टोकन बटन भी मारा।

फिर मैं फायरबेस कंसोल के साथ संदेश भेजने की कोशिश करता हूं और अपने ऐप पैकेज नाम पर लक्षित करने के लिए सेट करता हूं। मुझे कोई भी आने वाला संदेश मिला है।

मैं जानना चाहता हूं कि FCM का उपयोग किया जा सकता है? GCM सब कुछ ठीक है।

उपाय:

क्योंकि मैं Android डेवलपर नहीं हूं, सिर्फ बैकएंड डेवलपर हूं। इसलिए मुझे इसे हल करने में थोड़ा समय लगता है। मेरी राय में, नमूना ऐप में कुछ बग हैं।

कोड:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService {

    private static final String TAG = "RegIntentService";


    public RegistrationIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "FCM Registration Token: " + token);
    }
}

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
//        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);
//
//        // TODO: Implement this method to send any registration to your app's servers.
//        sendRegistrationToServer(refreshedToken);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     * <p>
     * Modify this method to associate the user's FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

इसे MainActivity.java में जोड़ें।

 Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);

ऊपर can करने के बाद आप logcat में टोकन प्राप्त कर सकते हैं। लेकिन अंत में मुझे इसे प्राप्त करने का एक सुविधाजनक तरीका मिल जाएगा। नमूना एप्लिकेशन को स्थापित करने के लिए बस डिबग मोड का उपयोग करें और जब आप पहली बार इसे स्थापित करने के लिए टोकन प्राप्त कर सकते हैं।

लेकिन जब मैं इसे स्थापित करता हूं तो यह लॉग को प्रिंट t why it can मुझे मोबाइल सिस्टम से संबंधित होना चाहिए।

और फिर मुझे Notification क्यों मिल सकता है। FirebaseMessagingService.onMessageReceived ने SendNotification को कॉल नहीं किया


Firebase- firebase-messaging:17.1.0 और नए में FirebaseInstanceIdService पदावनत है, आप https://.com/a/51475096/1351469 पर बताए अनुसार FirebaseMessagingService वर्ग पर onNewToken प्राप्त कर सकते हैं।

लेकिन अगर आप किसी भी समय केवल टोकन प्राप्त करना चाहते हैं, तो अब आप इसे इस तरह से कर सकते हैं:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(),  new OnSuccessListener<InstanceIdResult>() {
  @Override
  public void onSuccess(InstanceIdResult instanceIdResult) {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken",newToken);
  }
});

इसे इस्तेमाल करे

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult ->
             fcm_token = instanceIdResult.token}

इसे इस्तेमाल करे। आप RegistrationIntentService का उपयोग क्यों कर रहे हैं?

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {    
    @Override
    public void onTokenRefresh() {    
        String token = FirebaseInstanceId.getInstance().getToken();    
        registerToken(token);
    }

    private void registerToken(String token) {

    }
}

जो लोग यहां FirebaseInstanceIdService हैं, उनके लिए अब FirebaseInstanceIdService गया है, इसके बजाय उपयोग करें:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String token) {
        Log.d("MY_TOKEN", "Refreshed token: " + token);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        // sendRegistrationToServer(token);
    }
}

और AndroidManifest में घोषणा करें

<application... >

<service android:name=".fcm.MyFirebaseMessagingService">
    <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
</application>

टोकन प्राप्त करने के लिए आप Firebase (FCM) में निम्नलिखित का उपयोग कर सकते हैं:

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String **token** = task.getResult().getToken();

            }
        });

फायरबेस एंड्रॉयड एसडीके के पीछे की टीम एपीआई को थोड़ा बदल देती है। मैंने "टोकन टू सर्वर" तर्क को इस तरह लागू किया है:

FirebaseMessagingService के मेरे उदाहरण में:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

    @Override
    public void onNewToken(String token) {
        // sending token to server here
    }

    ...

}

ध्यान रखें कि टोकन प्रति उपकरण है, और यह आपके लॉगिन तर्क की परवाह किए बिना Firebase द्वारा अपडेट किया जा सकता है। इसलिए, यदि आपके पास लॉगिन और लॉगआउट कार्यक्षमता है, तो आपको अतिरिक्त मामलों पर विचार करना होगा:

  1. जब नया उपयोगकर्ता लॉग इन करता है, तो आपको टोकन को नए उपयोगकर्ता (सर्वर पर भेजना) से बांधना होगा। क्योंकि, पुराने उपयोगकर्ता के सत्र के दौरान टोकन को अद्यतन किया जा सकता है और सर्वर नए उपयोगकर्ता के टोकन को नहीं जानता है।
  2. जब उपयोगकर्ता लॉग आउट करता है, तो आपको टोकन को अनबाइंड करना होगा। क्योंकि, उपयोगकर्ता को अब सूचनाएं / संदेश प्राप्त नहीं होने चाहिए।

नए API का उपयोग करके, आप इस तरह टोकन प्राप्त कर सकते हैं:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String token = instanceIdResult.getToken();
            // send it to server
        }
    });

सौभाग्य!


यदि आप फायरबेस के कुछ नियम का उपयोग कर रहे हैं, तो आप इसका उपयोग करके टोकन ले सकते हैं:

//------GET USER TOKEN-------
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getToken(true)
        .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
            public void onComplete(@NonNull Task<GetTokenResult> task) {
                if (task.isSuccessful()) {
                    String idToken = task.getResult().getToken();
                      // ...
                }
            }
        });

यदि उपयोगकर्ता लॉग इन है तो अच्छी तरह से काम करें। getCurrentUser ()


विधि getToken() पदावनत है। आप इसके बजाय getInstanceId() उपयोग कर सकते हैं।

यदि आप instanceId(token) अनुरोध करते समय परिणाम संभालना चाहते हैं instanceId(token) , तो इस कोड की जाँच करें।

    FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> {
    if (instanceIdResult != null) {
        String token = instanceIdResult.getToken();
        if (!TextUtils.isEmpty(token)) {
            Log.d(TAG, "retrieve token successful : " + token);
        }
    } else{
        Log.w(TAG, "instanceIdResult should not be null..");
    }
}).addOnFailureListener(e -> {
    //do something with e
}).addOnCanceledListener(() -> {
    //request has canceled
}).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));

महत्वपूर्ण जानकारी।

अगर Google play service लटका हुआ है या नहीं चल रहा है, तो fcm रिटर्न टोकन = null

यदि ठीक से काम करने वाली सेवा चलती है तो FirebaseInstanceId.getInstance().getToken() विधि token लौटाती है

Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());

Settings.Secure.getString(getContentResolver(),
                     Settings.Secure.ANDROID_ID);






firebase-cloud-messaging