(Android)Mengembangkan Google Print Cloud

Sebelumnya ane sudah menjelaskan apa itu google print cloud, kali ini kita mencoba untuk membuat gimana menghubungkan app kita ke google print cloud, langsung ke TKP aja ya gan.

Create Project dengan nama printcloudannabe1

Buka res-layout-activitymain dan tuliskan bagian dibawah ini

 <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
  <WebView android:id="@+id/webview"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"/>
</RelativeLayout>

Buka file MainActivity.java dan ketikkan skrip bagian ini

 package com.example.printcloudannabe1;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Intent;
import android.os.Bundle;
import android.util.Base64;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

@SuppressLint("JavascriptInterface")
public class MainActivity extends Activity {
  private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html";
  private static final String JS_INTERFACE = "AndroidPrintDialog";
  private static final String CONTENT_TRANSFER_ENCODING = "base64";

  private static final String ZXING_URL = "http://zxing.appspot.com";
  private static final int ZXING_SCAN_REQUEST = 65743;

  /**
   * Post message that is sent by Print Dialog web page when the printing dialog
   * needs to be closed.
   */
  private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close";

  /**
   * Web view element to show the printing dialog in.
   */
  private WebView dialogWebView;

  /**
   * Intent that started the action.
   */
  Intent cloudPrintIntent;

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.activity_main);
    dialogWebView = (WebView) findViewById(R.id.webview);
    cloudPrintIntent = this.getIntent();

    WebSettings settings = dialogWebView.getSettings();
    settings.setJavaScriptEnabled(true);

    dialogWebView.setWebViewClient(new PrintDialogWebClient());
    dialogWebView.addJavascriptInterface(
      new PrintDialogJavaScriptInterface(), JS_INTERFACE);

    dialogWebView.loadUrl(PRINT_DIALOG_URL);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == ZXING_SCAN_REQUEST && resultCode == RESULT_OK) {
      dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT"));
    }
  }

  final class PrintDialogJavaScriptInterface {
    public String getType() {
      return cloudPrintIntent.getType();
    }

    public String getTitle() {
      return cloudPrintIntent.getExtras().getString("title");
    }

    public String getContent() {
      try {
        ContentResolver contentResolver = getContentResolver();
        InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer = new byte[4096];
        int n = is.read(buffer);
        while (n >= 0) {
          baos.write(buffer, 0, n);
          n = is.read(buffer);
        }
        is.close();
        baos.flush();

        return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return "";
    }

    public String getEncoding() {
      return CONTENT_TRANSFER_ENCODING;
    }

    public void onPostMessage(String message) {
      if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) {
        finish();
      }
    }
  }

  private final class PrintDialogWebClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      if (url.startsWith(ZXING_URL)) {
        Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");
        intentScan.putExtra("SCAN_MODE", "QR_CODE_MODE");
        try {
          startActivityForResult(intentScan, ZXING_SCAN_REQUEST);
        } catch (ActivityNotFoundException error) {
          view.loadUrl(url);
        }
      } else {
        view.loadUrl(url);
      }
      return false;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
      if (PRINT_DIALOG_URL.equals(url)) {
        // Submit print document.
        view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument("
          + "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle(),"
          + "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))");

        // Add post messages listener.
        view.loadUrl("javascript:window.addEventListener('message',"
            + "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)}, false)");
      }
    }
  }
}

Buka permission internet pada bagian androidmanifest.xml

<uses-permission android:name=”android.permission.INTERNET”/>

jalankan dan hasilnya seperti dibawah ini

12-02-2014 7-20-31

12-02-2014 7-22-01

12-02-2014 7-23-15

(Android)Mendaftarkan Printer ke Google Printer Cloud

Salam Semangat gan, pagi yang tidak mendukung di daerah jogja dan sekitarnya, dan sama dengan keadaan ane di postingan ini gan, ane sedang merasa galau tingkat akut gan sedih sedih dah rasanya, knpa kok sedih ? siapa yang gak sedih dibilang orang gak punya style dan orang yang mempunyai kehidupan yang miskin. Sebenarnya ane gak sedih sih gan, ada sedikit sedih dan senang, karena ane jarang sekali di bilang kayak itu di depan ane, kalo ane dibilang orang gak punya style dan kehidupan orang miskin gak papa, yang penting ane punya dwit dan duit ane gak ane buat makan di tempat tempat ane itu… FUCK buat anda….

Masuk ketema pembicaraaan, Google Print Cloud merupakan layanan yang diberikan oleh GOogle, layanan ini merupakan layanan percetakan(Emang Tempat Foto Copy), layanan google ini sangat memberikan kemudahan dalam mencetak dokumen dengan menggunakan device agan yang terkoneksi dengan internet dimana dan agan berada, disini kita akan memdaftarkan printer kita ke google print cloud

Pertama agan buka link ini http://www.google.com/cloudprint/learn/ dan klik coba sekarang

10-02-2014 23-36-00

Masuk dibagian print dan klik pada bagian management Print

12-02-2014 6-59-46

Dan agan masuk ke halaman berikutnya, klik bagian tambahkan printer klasik

12-02-2014 7-00-08

nah disana agan mendapat tutor dari google, ane kasih langsung aja dari sini, pada bagian google chorom agan, masuk ke setting

12-02-2014 7-00-27

klik bagian show advenced setting

12-02-2014 7-00-43

Add print deh

(Android) Google Print Cloud

10-02-2014 23-36-00
Google Cloud Print adalah teknologi baru yang menghubungkan printer Anda ke web. Dengan menggunakan Google Cloud Print, Anda dapat membuat printer rumah dan kantor tersedia bagi Anda dan siapa pun yang dipilih, dari aplikasi yang Anda gunakan setiap hari. Google Cloud Print bekerja di ponsel, tablet, Chromebook, PC, dan perangkat lainnya yang terhubung dengan web, tempat asal berkas yang ingin Anda cetak.

(Android)Install Glass Development Kit pada Eclipse Android

glass-logo-google-glass-logo-630x353
Salam Semangat Untuk Indonesia Merah Putih tercinta, Ane Anna arthdi putra tidak bosan bosan untuk membagi pengalaman ane di bidang android, karena ane sudah cintanya kepada indonesia dan pengembangan untuk android, kenapa ane cinta? tanya kenapa ? tidak jauh jauh karena ane seorang Calon Sarjana Infromatika dan ane anak jaringan, Google sangat menerapkan konsep jaringan dan sistem cerdasnya, ane di kampus Konsentrasi Jaringan dan ane di rumah sehari hari otak atok Sistem Informasi, gak nyambung banget ya, ya dah jangan terlalu dibahas, itu selingan aktifitas ane di dunia yang penuh tanda tanya ini.

Glass Development Kit sebellumnya sudah ane jelaskan pada postingan sebelumnya, sekarang kita akan mencoba memasang plugin GDK ini di IDE tercinta kita yaitu Eclipse, tidak terlalu susah kok, sama dengan Instalasi Plugin yang lainnya pada android developer….

Buka Eclipse agan yang tercinta

Buka Windows – Android SDK manager dan cari yang namanya Glass Developmen Kit Sneak Peek pada API 15 atau Android 4.0.3

05-02-2014 6-55-46

Setelah Instalasi agan bisa langsung buat project atau Sample Project

05-02-2014 6-55-04

05-02-2014 6-55-23

Nah setelah sample project kita dapat melihat plugin GDK pada Project SOlution

05-02-2014 6-56-13

Glass Code terpasang pada tampilan dan hak akses Manifest.xml

<intent-filter>
<action android:name=”com.google.android.glass.action.VOICE_TRIGGER” />
</intent-filter>
<meta-data
android:name=”com.google.android.glass.VoiceTrigger”
android:resource=”@xml/compass_show” />
gambar di atas code yang terletak pada manifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<!– Copyright (C) 2013 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
–>

<FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background=”@android:color/black”>

<com.google.android.glass.sample.compass.CompassView
android:id=”@+id/compass”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />

<RelativeLayout
android:id=”@+id/tips_container”
android:background=”@drawable/gradient50″
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:alpha=”0″>

<TextView
android:id=”@+id/tips_view”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:layout_alignParentBottom=”true”
android:layout_marginBottom=”@dimen/card_margin”
android:singleLine=”true”
android:ellipsize=”end”
android:textAppearance=”?android:attr/textAppearanceSmall” />

</RelativeLayout>

</FrameLayout>

Gambar diatas terletak pada tampilan, seperti kita mengguankan service google lainny, kita melink kan tampilan itu ke plugin yang kita gunakan

nah setelah semuanya selesai di jelaskan silakan coba sample app dengan device glassnya, kebetulan ane belum punya jadi tidak ane jalankan, tunggu waktunya yang tepat ketika device itu berada pada annabe work, insya allah…

(Android) Glass Developer Kit _ GDK

2128516google-5780x390

Welcome Glass Devepoler Tools, Banyak orang yang mengembangkan kaca mata pintar, ane mengenal kaca mata pintar pertama kali prototype nya Nokia, ane kira Glass ini hasil karya dari nokia, dan ternyata Glass ini punya Google Riset, hmmmm ternyata untuk prototype masih bisa kita buat dan menjadi hak paten pertama.

GDK buka SDK atau GBK(Gelora Bung Karno), GDK merupakan Kit atau Tools yang digunakan untuk developer dalam mengembangkan App untuk Google Glass, Kalo di bilang bisa jadi seperti Plugin yang kita ambil servicenya untuk IDE yang kita gunakan, GDK ini support pada IDE Eclipse, karena basic nya menggunakan android banyak sangkutannya dengan android dan java.

Banyak Sekali Feature yang digunakan pada Glass ente bisa lihat di sini https://developers.google.com/glass/

(Android) NFC Example Demo 1

NFC Technologi merupakan teknologi yang baru pada platform android di versi barunya, NFC ini hanya dapat digunakan di 2.3 Keatas dan tergantung dengan devicenya, jika devicenya tertanam alat pendeteksi NFC.

Create Project dengan Min SDK API 14

03-02-2014 15-06-47

Buat Tampilan seperti dibawah ini

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView_explanation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Device Anda Support Technologi NFC" />

</RelativeLayout>

Edit MainActivity.java

 package com.example.nfcannabedemo1;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;


import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	public static final String MIME_TEXT_PLAIN = "text/plain";
	public static final String TAG = "NfcDemo";

	private TextView mTextView;
	private NfcAdapter mNfcAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mTextView = (TextView) findViewById(R.id.textView_explanation);

		mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

		if (mNfcAdapter == null) {
			// Stop here, we definitely need NFC
			Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show();
			finish();
			return;

		}
	
		if (!mNfcAdapter.isEnabled()) {
			mTextView.setText("NFC is disabled.");
		} else {
			mTextView.setText(R.string.action_settings);
		}
		
		handleIntent(getIntent());
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		
		/*
		 * It's important, that the activity is in the foreground (resumed). Otherwise
		 * an IllegalStateException is thrown. 
		 */
		setupForegroundDispatch(this, mNfcAdapter);
	}
	
	@Override
	protected void onPause() {
		/*
		 * Call this before onPause, otherwise an IllegalArgumentException is thrown as well.
		 */
		stopForegroundDispatch(this, mNfcAdapter);
		
		super.onPause();
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		/*
		 * This method gets called, when a new Intent gets associated with the current activity instance.
		 * Instead of creating a new activity, onNewIntent will be called. For more information have a look
		 * at the documentation.
		 * 
		 * In our case this method gets called, when the user attaches a Tag to the device.
		 */
		handleIntent(intent);
	}
	
	private void handleIntent(Intent intent) {
		String action = intent.getAction();
		if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
			
			String type = intent.getType();
			if (MIME_TEXT_PLAIN.equals(type)) {

				Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
				new NdefReaderTask().execute(tag);
				
			} else {
				Log.d(TAG, "Wrong mime type: " + type);
			}
		} else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
			
			// In case we would still use the Tech Discovered Intent
			Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
			String[] techList = tag.getTechList();
			String searchedTech = Ndef.class.getName();
			
			for (String tech : techList) {
				if (searchedTech.equals(tech)) {
					new NdefReaderTask().execute(tag);
					break;
				}
			}
		}
	}
	
	/**
	 * @param activity The corresponding {@link Activity} requesting the foreground dispatch.
	 * @param adapter The {@link NfcAdapter} used for the foreground dispatch.
	 */
	public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
		final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
		intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

		final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);

		IntentFilter[] filters = new IntentFilter[1];
		String[][] techList = new String[][]{};

		// Notice that this is the same filter as in our manifest.
		filters[0] = new IntentFilter();
		filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
		filters[0].addCategory(Intent.CATEGORY_DEFAULT);
		try {
			filters[0].addDataType(MIME_TEXT_PLAIN);
		} catch (MalformedMimeTypeException e) {
			throw new RuntimeException("Check your mime type.");
		}
		
		adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
	}

	/**
	 * @param activity The corresponding {@link BaseActivity} requesting to stop the foreground dispatch.
	 * @param adapter The {@link NfcAdapter} used for the foreground dispatch.
	 */
	public static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter) {
		adapter.disableForegroundDispatch(activity);
	}
	
	/**
	 * Background task for reading the data. Do not block the UI thread while reading. 
	 * 
	 * @author Ralf Wondratschek
	 *
	 */
	private class NdefReaderTask extends AsyncTask {

		@Override
		protected String doInBackground(Tag... params) {
			Tag tag = params[0];
			
			Ndef ndef = Ndef.get(tag);
			if (ndef == null) {
				// NDEF is not supported by this Tag. 
				return null;
			}

			NdefMessage ndefMessage = ndef.getCachedNdefMessage();

			NdefRecord[] records = ndefMessage.getRecords();
			for (NdefRecord ndefRecord : records) {
				if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
					try {
						return readText(ndefRecord);
					} catch (UnsupportedEncodingException e) {
						Log.e(TAG, "Unsupported Encoding", e);
					}
				}
			}

			return null;
		}
		
		private String readText(NdefRecord record) throws UnsupportedEncodingException {
			/*
			 * See NFC forum specification for "Text Record Type Definition" at 3.2.1 
			 * 
			 * http://www.nfc-forum.org/specs/
			 * 
			 * bit_7 defines encoding
			 * bit_6 reserved for future use, must be 0
			 * bit_5..0 length of IANA language code
			 */

			byte[] payload = record.getPayload();

			// Get the Text Encoding
			String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";

			// Get the Language Code
			int languageCodeLength = payload[0] & 0063;
			
			// String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");
			// e.g. "en"
			
			// Get the Text
			return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
		}
		
		@Override
		protected void onPostExecute(String result) {
			if (result != null) {
				mTextView.setText("Read content: " + result);
			}
		}
	}
}




Membuka permissiion NFC pada android manifest.xml

     <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.NFC"/>
   <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

Run Project

03-02-2014 15-11-29

Jika device anda terdapat NFC Detector Maka akan menampilkan toast dengan Device anda Support

(Android)Near Field Communication (NFC)

Near Field Communication (NFC) is a set of short-range wireless technologies, typically requiring a distance of 4cm or less to initiate a connection. NFC allows you to share small payloads of data between an NFC tag and an Android-powered device, or between two Android-powered devices.

Tags can range in complexity. Simple tags offer just read and write semantics, sometimes with one-time-programmable areas to make the card read-only. More complex tags offer math operations, and have cryptographic hardware to authenticate access to a sector. The most sophisticated tags contain operating environments, allowing complex interactions with code executing on the tag. The data stored in the tag can also be written in a variety of formats, but many of the Android framework APIs are based around a NFC Forum standard called NDEF (NFC Data Exchange Format). http://developer.android.com/guide/topics/connectivity/nfc/index.html

http://open-nfc.org/wp/editions/android/

sep7_nearfield02

<uses-permission android:name=”android.permission.NFC”%gt;