OSC2011 Androidハンズオン

Embed Size (px)

DESCRIPTION

オープンソースカンファレンス2011大分のハンズオンセッションの資料です。シンプルなAndroid用Twitterクライアントを作ります

Citation preview

  • 1. Android 2011319 Android http://goo.gl/mqLhB

2.

3. HelloWorld 4. Android 5. Android 6. 7. 8. Twitter 9.

  • Eclipse

10. [Window] -> [Android SDK and AVD Manager] 11.

  • Name: android1.6)

12. Target:Android 1.6 - API Lebel 4 13. SD Card - Size :10MiB 14. Skin - Built-in :HVGA 15.

  • OK
  • MENU

16. MENU -> Settings 17. Locale & text 18. Select locale 19. Japanese 20. 21. HelloWorld 22. HelloWorld

  • File -> New -> Android Project
  • Project name :HelloAndroid

23. Build Target :Android 1.6 24. Application name : Android ( ) 25. Package name :osc11ot.android.hello 26. Create Activity :HelloActivity 27. Min SDK Version :4 EclipsePackage ExplolerHelloAndroid 28. Run -> Run 29. Android Application OK 30. 31. Android http://www.android-group.jp/ 32. Android http://www.facebook.com/android.oita 33. ML Android http://groups.google.com/group/android-group-japan http://goo.gl/HGn56 http://groups.google.com/group/android-group-japan-oita http://goo.gl/B8BK5 34. Android http://goo.gl/91RNS http://goo.gl/rRXEC ANDROID developers Android 35. Twitter

36. Twitter Twitter4J Twitter4J API 37.

38. 39. 40. Twitter API 41. 42. eclipse [File] - [New] - [Project..] Android Project [Next >] 43. New Android Project[Finish]

  • Project name :InputSample

44. Application name : 45. Package name :osc11ot.android.inputsample 46. Create Activity :InputActivity 47. Min SDK Version :4 48.

  • Package Explorer InputSample -> res -> layout -> main.xml

49. [Form Widgets]EditText 50. [Form Widgets]Button 51. 52.

53. ->[Edit Text...] 54. [New String] 55. String : 56. New R.string. :greeting 57. [OK] 58. [greeting][OK] 59.

  • ID

60. [Edit ID...] 61. IDOK id :editText1 62. ID id :button1 main.xml

  • ctrl + s Save

63.

  • Package Explorer InputSample->[]->InputActivity.java

64. onCreate public voidonCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. main ); finalEditText editText = (EditText) findViewById(R.id. editText1 ); Button button = (Button) findViewById(R.id. button1 ); button.setOnClickListener( newOnClickListener() { @Override public voidonClick(View v) { AlertDialog.Builder builder =newAlertDialog.Builder( InputActivity. this ); builder.setMessage(editText.getText()); builder.create().show(); } }); } 65.

  • Run->Run

66. [ESC] 67. 68. -> Japanese IME 69. 70. eclipse [File] - [New] - [Project..] Android Project [Next >] 71. Eclipse

  • Project name :ListViewSample

72. Application name : 73. Package name :osc11ot.android.listviewsample 74. Create Activity :ListActivity 75. Min SDK Version :4 76.

  • Package Explorer InputSample -> res -> layout -> main.xml

77. [Form Widgets]Button 78. [Composite]ListView 79. 80.

81. ->[Edit Text...] 82. [New String] 83. String : 84. New R.string. :add 85. [OK] 86. [add][OK] 87.

  • ID

88. [Edit ID...] 89. IDOK id :button1 90. ID id :listView1 main.xml

  • ctrl + s Save

91.

  • Package Explorer ListViewSample->[]->ListActivity.java

92. public classListActivityextendsActivity { privateArrayListarrayList ; privateArrayAdapterarrayAdapter ; 93.

  • OnClickLisner OnCreate

classAddButtonOnClickListnerimplementsOnClickListener { @Override public voidonClick(View v) { arrayList .add(String. format ( "%tT" ,newDate())); arrayAdapter .notifyDataSetChanged(); } } 94.

  • onCreate

public voidonCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. main ); arrayList=newArrayList(); arrayAdapter=newArrayAdapter( this , android.R.layout. simple_list_item_1 ,arrayList ); ListView listView = (ListView) findViewById(R.id. listView1 ); listView.setAdapter( arrayAdapter ); Button button = (Button)findViewById(R.id. button1 ); button.setOnClickListener( newAddButtonOnClickListner()); } 95.

  • Run->Run

96. 97. Android 98. Eclipse

  • Project name :IntentSample

99. Application name : 100. Package name :osc11ot.android.intentsample 101. Create Activity :MainActivity 102. Min SDK Version :4 103.

  • ButtonListView

104. ButtonListViewID ID ButtonID :showInputButton ListViewID :listView1 105. 106.

  • File->New->Android XML File

107. File :input What type of... :Layout 108.

  • input.xmlButton2EditText

109. ButtonEditTextID ButtonID :addButton ButtonID :cancelButton EditTextID :editText 110. 111. addButton : cancelButton : 112.

  • File->New->Class
  • Name :InputActivity

113. Superclass :android.app.Activity 114. Interfaces :android.view.View.OnClickListener 115. public classInputActivityextendsActivityimplementsOnClickListener { privateButtonaddButton ; privateButtoncancelButton ; privateEditTexteditText ; @Override public voidonCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. input ); addButton= (Button) findViewById(R.id. addButton ); cancelButton= (Button) findViewById(R.id. cancelButton ); editText= (EditText) findViewById(R.id. editText1 ); addButton .setOnClickListener( this ); cancelButton .setOnClickListener( this ); } 116. @Override public voidonClick(View view) { if(view ==addButton ) { Intent intent =newIntent(); intent.putExtra( "text" ,editText .getText()); setResult( RESULT_OK , intent); finish(); }else if (view ==cancelButton ) { setResult( RESULT_CANCELED ); finish(); } } 117.

  • Package Explorer IntentSample->[]->MainActivity.java

118. public classMainActivityextendsActivity { privateArrayListarrayList ; privateArrayAdapterarrayAdapter ; 119.

  • onCreate

public voidonCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. main ); arrayList=newArrayList(); arrayAdapter=newArrayAdapter( this , android.R.layout. simple_list_item_1 ,arrayList ); ListView listView = (ListView) findViewById(R.id. listView1 ); listView.setAdapter( arrayAdapter ); Button showInputButton = (Button) findViewById(R.id. showInputButton ); showInputButton.setOnClickListener( newOnClickListener() { @Override public voidonClick(View v) { Intent intent =newIntent(MainActivity. this , InputActivity. class ); startActivityForResult(intent, 0); } }); } 120.

  • startActivityForResultonActivityResult

@Override protected voidonActivityResult( intrequestCode,intresultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); if(requestCode == 0 && resultCode ==RESULT_OK ) { CharSequence text = data.getCharSequenceExtra( "text" ); if(text !=null ) { arrayList .add(text.toString()); arrayAdapter .notifyDataSetChanged(); } } } 121.

  • X-(

122. AndroidManifest.xml Activity 123. < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "osc11ot.android.intentsample" android:versionCode = "1" android:versionName = "1.0" > < uses-sdk android:minSdkVersion = "4" /> < application android:icon = "@drawable/icon" android:label = "@string/app_name" > < activity android:name = ".MainActivity" android:label = "@string/app_name" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> intent-filter > activity > < activity android:name = "InputActivity" /> application > manifest > 124. Twitter Twitter 125. Twitter Twitter Twitter ID :oitand_handson :osc11othandson 126. Twitter4J

127. libs

  • File->New->Folder libs

jar

  • libs twitter4j-core-***.jar

128. Java Build Path 129. LibrariesApp JARstwitter4j-core-***.jar

  • AndroidManifest.xmlandroid.permission.INTERNET

130.

  • main.xmlButtonListView
  • TL

ButtonListViewID 131. ButtonID :loginButton ButtonID :showInputButton ButtonID :reloadButton ListViewID :listView1 132. 133.

  • File->New->Android XML File

134. File :input What type of... :Layout 135.

  • input.xmlButton2EditText (IntentSample

136. ButtonEditTextID ButtonID :addButton ButtonID :cancelButton EditTextID :editText 137. 138. addButton : cancelButton : 139.

  • File->New->Class
  • Name :InputActivity

140. Superclass :android.app.Activity IntentSampleInputActivity 141. Twitter OAuth MainActivity 142. public classMainActivityextendsActivity { private static finalStringCONSUMER_KEY="yKpNTNfzgBArazXD4YYqQ" ; private static finalStringCONSUMER_SERCRET="UOq30kqYI8jWhMO06Jzufbo0B8s9S6hBUXK1GvT2Ayo" ; private static finalStringCALLBACK_URL="osc11ot://oauthcallback" ; private static finalStringPREF_TOKEN="token" ; private static finalStringPREF_SECRET="tokenSecret" ; private static finalStringTAG="osc11ot" ; privateTwittertwitter ; privateRequestTokenrequestToken ; @Override public voidonCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. main ); AccessToken token = loadAccessToken(); if(token !=null ) { twitter=newTwitterFactory().getInstance(); twitter .setOAuthConsumer( CONSUMER_KEY ,CONSUMER_SERCRET ); twitter .setOAuthAccessToken(token); } } 143. protected voiddoOAuthLogin() { try{ twitter=newTwitterFactory().getInstance(); twitter .setOAuthConsumer( CONSUMER_KEY ,CONSUMER_SERCRET ); requestToken=twitter .getOAuthRequestToken( CALLBACK_URL ); String url =requestToken .getAuthorizationURL(); startActivity( newIntent(Intent. ACTION_VIEW , Uri. parse (url))); }catch(Exception e) { Log. e ( TAG ,"login error" , e); } } @Override protected voidonNewIntent(Intent intent) { super .onNewIntent(intent); Uri uri = intent.getData(); if(uri !=null&& uri.toString().startsWith( CALLBACK_URL )) { String verifier = uri.getQueryParameter( "oauth_verifier" ); try{ AccessToken token =twitter .getOAuthAccessToken( requestToken , verifier); saveAccessToken(token); Toast. makeText ( this ,"OAuth " , Toast. LENGTH_SHORT ).show(); }catch(TwitterException e) { Log. e ( TAG ,"login error" , e); } } } 144. private voidsaveAccessToken(AccessToken token) { SharedPreferences pref = getSharedPreferences( PREF_TOKEN ,MODE_PRIVATE ); SharedPreferences.Editor editor = pref.edit(); editor.putString( PREF_TOKEN , token.getToken()); editor.putString( PREF_TOKEN , token.getTokenSecret()); editor.commit(); } privateAccessToken loadAccessToken() { AccessToken result =null ; SharedPreferences pref = getSharedPreferences( PREF_TOKEN ,MODE_PRIVATE ); String token = pref.getString( PREF_TOKEN ,null ); String secret = pref.getString( PREF_SECRET ,null ); if(token !=null&& secret !=null ) { result =newAccessToken(token, secret); } returnresult; } } 145. doOAuthLogin OK! 146. AndroidManifest.xml InputActivity MainActivity intent-filter < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "osc11ot.android.twittersample" android:versionCode = "1" android:versionName = "1.0" > < uses-sdk android:minSdkVersion = "4" /> < uses-permission android:name = "android.permission.INTERNET" /> < application android:icon = "@drawable/icon" android:label = "@string/app_name" > < activity android:name = ".MainActivity" android:label = "@string/app_name" android:launchMode = "singleTask" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> intent-filter > < intent-filter > < action android:name = "android.intent.action.VIEW" /> < category android:name = "android.intent.category.DEFAULT" /> < category android:name = "android.intent.category.BROWSABLE" /> < data android:scheme = "osc11ot" android:host = "oauthcallback" /> intent-filter > activity > < activity android:name = ".InputActivity" /> application > manifest > 147. twitter .updateStatus(String) try{ twitter .updateStatus(tweet); }catch(TwitterException e) { Log. w ( TAG ,"error" , e); Toast. makeText ( this , , Toast. LENGTH_LONG ); } 148. twitter .getFriendsTimeline() twitter4j.Status List (List) Status#getUser() User#getName() Status#getText() Status#getCreatedAt() String. format ( "%s: %s%tF %tT" , status.getUser() .getName(), status.getText(), status.getCreatedAt(), status.getCreatedAt()) 149. :- )