Ketika melakukan “Submit an update” pada aplikasi yang telah ter-publish pada akun App Hub dan melakukan pengunggahan ulang file XAP yang baru, saya sempat memperoleh pesan kesalahan sebagai berikut:
An update cannot support fewer languages than the previous app instance supported (1047)
Ternyata pesan kesalahan ini dapat disebabkan oleh perbedaan dukungan bahasa pada versi terbaru aplikasi dengan versi yang telah ter-publish pada Windows Phone Marketplace. Sebagai contoh, versi sebelumnya dari suatu aplikasi hanya mendukung Bahasa Indonesia, sedangkan versi pembaruan dari aplikasi ternyata tidak lagi mendukung Bahasa Indonesia melainkan hanya Bahasa Inggris. App Hub akan secara otomatis mendeteksi dukungan bahasa yang tersimpan pada XAP resource file. Berikut adalah langkah-langkah untuk mengatur “Neutral Language” pada project Visual Studio dari aplikasi:
- Klik kanan pada project name di Solution Explorer, kemudian pilih ‘Properties’
- Pada tab “Application”, klik tombol “Assembly Information”
- Ubah combo box Neutral Language seperti yang terlihat pada gambar berikut:
Solusi dari pesan kesalahan tersebut ada 2, yaitu:
- Membuat versi terbaru dari aplikasi tersebut yang mendukung beberapa bahasa dengan memanfaatkan Localization.
- “Submit a new app” pada App Hub dengan versi terbaru aplikasi yang tidak lagi memiliki dukungan terhadap bahasa terdahulu. Ketika versi terbaru tersebut telah certified dan published, maka unpublished versi lama dari aplikasi tersebut. (Aplikasi akan memiliki application id yang baru)
Semoga bermanfaat!
Ada kalanya, kita perlu untuk menampilkan sebuah informasi kepada pengguna dalam beberapa baris pada sebuah. Lalu, bagaimana cara menampilkan Multiline Textblock melalui C# code? Berikut adalah langkah-langkahnya:
- Tambahkan sebuah TextBlock pada PhoneApplicationPage dengan drag & drop dan beri nama txbUnlockStatus.

- Tambahkan kode berikut untuk membuat TextBlock terdiri dari 2 baris string.
txbUnlockStatus.Text = string.Empty; Run r = new Run(); r.Text = "Ghost Buster medal is unlocked"; txbUnlockStatus.Inlines.Add(r); txbUnlockStatus.Inlines.Add(new LineBreak()); r = new Run(); r.Text = "Ghost Enthusiast medal is unlocked"; txbUnlockStatus.Inlines.Add(r);
Selamat mencoba!
Sebelumnya saya pernah menulis sebuah artikel berjudul “In-App Advertising dengan Inneractive pada J2ME”, Inneractive ternyata baru saja memperbarui InneractiveAdSDK-J2ME nya yang dirilis dengan versi 1.0.5 pada 8 Maret 2012. Salah satu kelebihan dari versi ini adalah developer memiliki kebebasan untuk menampilkan ads sesuai dengan look and feel pada aplikasi/game yang dikembangkan. Di versi sebelumnya, SDK tersebut hanya menyediakan method IASDK.displayAd() yang akan secara otomatis menampilkan sebuah ad pada Display. Pada versi terbarunya, SDK ini menyediakan sebuah API untuk memperoleh Banner Ad sesuai dengan standard MMA. Berikut adalah langkah-langkah untuk mengimplementasikan in-app advertising dengan SDK terbaru dari Inneractive pada J2ME:
- Mendaftar akun inneractive sebagai publisher pada tautan berikut: http://console.inner-active.com/iamp/publisher/register

- Login ke akun inneractive dengan memasukkan username dan password pada tautan berikut: http://console.inner-active.com/iamp/auth/login

- Klik tab ‘Add App’

- Pilih combo box ‘Platform’ dengan pilihan ‘OVI’ lalu lengkapi isian lainnya yang tersedia.

- Pada ‘Dashboard’, aplikasi yang baru saja dibuat akan muncul beserta ‘App ID’ dari aplikasi tersebut.

- Klik tab ‘SDK’s’, lalu unduh inneractive SDK untuk J2ME.

- Unzip file ‘inneractiveAdSDK-J2ME-v1.0.5.zip’ yang baru saja diunduh.
- Tambahkan ’inneractiveJ2MEAdSDK.jar’ pada ‘Library dan Resource’ project Netbeans yang telah dibuat.

- Tambahkan beberapa JAD parameter berikut pada project Netbeans.
IA-X-appID: IA_GameTest (App ID dapat dilihat pada tab ‘Dashboard’)

- Tambahkan beberapa MIDlet Permission javax.microedition.io.Connector.http,javax.microedition.io.Connector.socket, javax.microedition.pim.ContactList.read, javax.microedition.io.Connector.sms, javax.wireless.messaging.sms.send pada kotak dialog ‘API Permission’:

- Tambahkan potongan kode inner class berikut pada kelas yang merupakan turunan dari kelas MIDlet / Canvas. Method IADView.getBannerAdData() digunakan untuk melakukan request Banner Ad ke Inneractive dan akan mengembalikan return value bertipe Vector dimana indeks ke-0 adalah Image dan indeks ke-1 adalah string yang merupakan link dari Ad tersebut.
class Worker extends Thread { boolean terminated = false; int mTask; PromotionalState mOwner; public Worker( PromotionalState owner ) { mOwner = owner; } synchronized public void run() { while (!terminated) { mTask = IDLE; try { wait(); } catch (InterruptedException ex) {} try { switch (mTask) { case CLICK_THE_BANNER: if(null != Ad){ String clickURL = (String)Ad.elementAt(1); if(null != clickURL && !clickURL.equals("")){ boolean forceExit = MainMIDlet.instance.platformRequest( clickURL ); System.out.println("platformRequest - the midlet should be close? " + forceExit); if(forceExit){ MainMIDlet.quitApp(); } } } break; case GET_BANNER_AD: System.out.println("IADView.getBannerAd()" ); Ad = IADView.getBannerAdData(MainMIDlet.instance); imgBanner = null; if (null != Ad){ imgBanner = (Image)Ad.elementAt(0); } if (imgBanner != null){ Image.createImage(imgBanner); } else{ System.out.println("retImg is null"); } break; } } catch (Exception e) { System.out.println(e.getMessage()); } catch (Throwable e) { System.out.println(e.getMessage()); } } } synchronized public boolean doTask( int task ) { if (mTask != IDLE) return false; mTask = task; notify(); return true; } } - Berikutnya, kelas Worker tersebut harus di-instantiate dan Thread tersebut harus dijalankan dengan perintah berikut.
worker = new Worker( this ); worker.start();
- Tampilkan Image Banner Ad yang diperoleh
if (imgBanner != null){ g.drawImage(imgBanner, 12, 73 + yAnimation, 0); } - Lakukan pengecekan apakah pengguna melakukan action pada Banner Ad tersebut, apabila pengguna menekan Banner Ad tersebut maka panggilah method berikut:
worker.doTask( CLICK_THE_BANNER );
Berikut adalah contoh tampilan Banner Ad dari Inneractive:
Selamat mencoba!
Saat mengembangkan sebuah aplikasi J2ME yang melakukan koneksi ke server menggunakan TCP client sockets, suatu saat mungkin saja anda akan dihadapkan dengan permasalahan dimana muncul java.io.IOException: Resource limit exceeded for TCP client sockets. Penyebab dari permasalahan ini sangatlah, yaitu:
- HttpConnection yang sudah di-open ke server, tidak di-close.
- InputStream atau OutputStream yang berada pada Connection tersebut tidak di-close.
Jika Stream dan Connection tidak ditutup dengan benar, maka keduanya akan tetap terbuka. Semua perangkat mobile memiliki batas seberapa banyak koneksi yang dapat dibuka pada suatu waktu sehingga jika keduanya tetap dibiarkan dalam keadaan terbuka maka perangkat mobile tersebut akan kehabisan kuota untuk melakukan koneksi.
Caranya sangatlah mudah namun hal ini sangatlah krusial:
HttpConnection conn = (HttpConnection) Connector.open(url); InputStream is = conn.openInputStream(); ... is.close(); conn.close();
Semoga bermanfaat!




