Languages

Menu
Sites
Language
Reading NFC tag content

I'm literally struggling to implement a NFC tag reading functionality in my native app.

As it is, it's a very simple app with a list and some rest calls to interface with my server.
Now I would like to be able, as soon as my app is "on screen" to read the content of a compatible NFC TAG. It's really frustrating.
Can you please help me?

The reference I'm following:

  1. - sort of guide: guides/native-application/connectivity-and-wireless/nfc
  2. - NFC manager API
  3. - NFC tag API
  4.  

First problem: in the "example code" in the guide, gmainloop is used but.. GMainLoop is not a valid identifier! So I had to comment out all the lines referring to that. Quite crazy.

Second problem: should I start listening for NFC events in my app_resume, while cleaning up everything NFC related in app_suspend?

Third problem: how do you print a meaningful error, if that error is an enum?

 

My actual code:

static void
on_nfc_ndef_discovered(nfc_ndef_message_h message, void *user_data)
{
    int count;
    int i;
    unsigned int size;
    unsigned char * payload;
    nfc_ndef_record_h record;

    nfc_ndef_message_get_record_count(message, &count);
    dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_ndef_discovered %d", count);

    for (i = 0; i < count; i++) {
        nfc_ndef_message_get_record(message, i, &record);
        nfc_ndef_record_get_payload(record, &payload, &size);
        dlog_print(DLOG_INFO, LOG_TAG, "Record Number: %d, Payload: %s", i, payload);
    }
}

static void on_nfc_tag_discovered(nfc_discovered_type_e type, nfc_tag_h tag, void *user_data) {

    // (nfc_tag_h tag, nfc_tag_type_e *type)
	//int tagType = nfc_tag_get_type(tag, type);
    dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_tag_discovered, tagType: %d", 1);//=tagType);

}

void nfcInit(void) {
	int error_code = NFC_ERROR_NONE;

	error_code = nfc_manager_initialize();
	if (NFC_ERROR_NONE != error_code) {
	    /* Error occurred */
		dlog_print(DLOG_ERROR, LOG_TAG, "(NFC) nfcInit error");
	}
	//g_timeout_add(1000, timeout_func, gmainloop);
	//g_main_loop_run(gmainloop);
	nfc_manager_set_tag_filter(NFC_TAG_FILTER_ALL_ENABLE);




	error_code = nfc_manager_set_ndef_discovered_cb(on_nfc_ndef_discovered, NULL);
	if (NFC_ERROR_NONE != error_code)
		dlog_print(DLOG_ERROR, LOG_TAG, "(NFC) nfcInit nfc_manager_set_ndef_discovered_cb error");

	error_code = nfc_manager_set_tag_discovered_cb(on_nfc_tag_discovered, NULL);
	if (NFC_ERROR_NONE != error_code)
		dlog_print(DLOG_ERROR, LOG_TAG, "(NFC) nfcInit nfc_manager_set_tag_discovered_cb error, %i", error_code);

	dlog_print(DLOG_ERROR, LOG_TAG, "(NFC) nfcInit COMPLETE");

}

void
Network_NFC_startup(void)
{
    //GMainLoop* gmainloop = g_main_loop_new(NULL, FALSE);
    bool is_nfc_supported = nfc_manager_is_supported();
    if (!is_nfc_supported) {
        dlog_print(DLOG_INFO, LOG_TAG, "(NFC) is_nfc_supported NOT SUPPORTED");
    }
    else {
    	dlog_print(DLOG_INFO, LOG_TAG, "(NFC) is_nfc_supported SUPPORTED");

    	nfcInit();
    }
}

void
Network_NFC_cleanup(void)
{
    //g_main_loop_unref(gmainloop);
    nfc_manager_deinitialize();
}

static void
app_pause(void *data)
{
    /* Take necessary actions when application becomes invisible. */

	dlog_print(DLOG_INFO, LOG_TAG, "app_pause\n");

	Network_NFC_cleanup();
}

static void
app_resume(void *data)
{
	/* Take necessary actions when application becomes visible. */

	dlog_print(DLOG_INFO, LOG_TAG, "app_resume\n");
	
	Network_NFC_startup();
}

I get: 

(NFC) is_nfc_supported SUPPORTED

But the error is: I can't even get to register the callback for nfc_manager_set_tag_discovered_cb:

(NFC) nfcInit nfc_manager_set_tag_discovered_cb error, -1073741822

(Please, let me know how to print "error" in some human readable format..).

This is *VERY FRUSTRATING*. I'm not that good with C, but I really think that Tizen doc should be able to help a little more..

Can you please help me?

Responses

1 Replies
MajinJoko

NFC.tag mode is not supported for Watch Active.

There is no wearable that can do that at the moment.