狠狠撸

狠狠撸Share a Scribd company logo
青空読手とインテント
 2011/09/30(金)@東北支部発信会
           樋口 祐紀
 (@hyukix / hyukix@gmail.com)
自己绍介
自己绍介
名前: 樋口 祐紀
  (ひぐち ゆうき)
年齢: 31歳
  (1980/02/08)
出身: 三重県四日市市
所属: (株)PRO&BSC
趣味: 10年前までは...
                 3
础苍诲谤辞颈诲との関わりは...




                   4
青空読手って!?
青空読手のご紹介①
作者一覧やランキングから選択   文庫の表示   もちろんしおり機能も




                                      6
青空読手のご绍介②
               サイズ: 極大 + 太さ: 極太   サイズ: 極小 + 太さ: 極細

文字のサイズと太さの指定




                                                 7
青空読手のご绍介③


               SDカードや本体内の
              テキストの読み込みも可能

  横向き表示にも対応




                             8
mobile ASCII vol.5に掲載!
               2011/7/29発行




                             9
PLUTINUM Prize
  頂きました!




                 10
ディベロッパーコンソール




                          端末                                      国
1 Samsung Galaxy S                   12.5% (14,561)   1 日本        98.3% (114,643)
2 Sharp IS03                         10.7% (12,507)   2 アメリカ合衆国       0.4% (481)
3 Fujitsu Toshiba REGZA Phone T01C    8.8% (10,219)   3 中国            0.3% (321)
4 SEMC Xperia X10                      6.8% (7,946)   4 大韓民国          0.2% (224)
5 Samsung Galaxy Tab                   6.5% (7,544)   5 台湾            0.2% (214)
6 SO-02C                               6.4% (7,485)   6 香港              0.1% (98)
7 SEMC Xperia Arc                      6.3% (7,313)   7 タイ              0.1% (84)
8 Samsung Galaxy S2                    4.3% (4,959)   8 イギリス            0.1% (71)
9 Sharp IS01                           3.1% (3,599)   9 オーストラリア         0.0% (52)
10 Sharp Lynx 3D SH-03C                3.0% (3,455)   10 シンガポール                11
                                                                        0.0% (51)
どうやって作ってるの?
どうやって作ってるの!?①
   ? データは青空文庫サイト *1 から
     zipファイルをDL後、解凍
       – 500文庫分のzipファイルへのリン
         クを保持

   ? フォントは「IPA明朝」をダウン
     ロードして利用
   ? SurfaceViewで頑張って描画
       – (背景+本文+ルビ+タイトル
         +ページ数)x 2
*1 … http://www.aozora.gr.jp/   13
どうやって作ってるの!?②
? Twitterによるつぶやき




                   14
どうやって作ってるの!?③
 ? Twitterへのつぶやき投稿はこんなにかんたん!

final String msg = " 『坊っちゃん』なう #aozorayomite";
final Uri uri = Uri.parse(
      http://twitter.com/home/?status=
      + URLEncoder.encode(msg, "UTF-8"));
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);




                                                        15
どうやって作ってるの!?④
                                              def get_or_post(self):
                                                pdev = self.request.get('dev').encode('utf-8')
                                                pos = self.request.get('os').encode('utf-8')
                                                pver = self.request.get('ver').encode('utf-8')
                                                ptitle = self.request.get('title').encode('utf-8')
                                                pbug = self.request.get('bug').encode('utf-8')

                                                report   = "dev: " + pdev + "?n"
                                                report   += "os: " + pos + "?n"
                                                report   += "ver: " + pver + "?n"
                                                report   += "title: " + ptitle + "?n"
                                                report   += "bug: " + pbug

                                                mail.send_mail(
                                                  sender='hyukix@gmail.com',
                                                  to='hyukix@gmail.com',
                                                  subject='Bug Report - AozoraYomite',
                                                  body=report)




【参考サイト】throw Life - Androidアプリのバグ報告システムを考える
http://www.adamrocker.com/blog/288/bug-report-system-for-android.html                        16
どうやって作ってるの!?⑤
? 青空プロバイダとの連携機能




                  17
突然ですがクイズです
? Twitter / Evernote / メールを利用し、
  任意の文字列を送信するAndroidアプ
  リを作るのに必要な時間は?
  A. 3分
  B. 3時間
  C. 3日
  D. Androidでは無理... だけど...
    3秒でできるよ。そう、iPhoneならね 18
これだけ書けば解決!
public class Test extends Activity {
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

        new AlertDialog.Builder(this).setMessage("Start activity ?")
          .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int whichButton) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "Hello, Android!!");
                startActivity(intent);
             }
          }).setNegativeButton("No", null).show();
    }
}                                                                       19
This is Android!!   Evernote
                               IMoNi
                                       twicca




                                          20
インテントって!?
インテントって何?
  ? 処理依頼メッセージのこと
      – 例: AK Notepadによる他アプリ機能




     AK Notepadにてテキ    ACTION_SEND イ ン    Twidroidにペーストさ
     ストを入力。メニューから      テ ン トが発行 さ れ 、 対   れる。ポイントは相互連
     Shareを指定すると…      応アプリがリストアップ        携を前提としてない点
出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc             22
Extra Data
IntentとExtraData                                            –
                                                            –
                                                                EXTRA_ALARM_COUNT
                                                                EXTRA_BCC
Activity Actions         Broadcast Actions                  –   EXTRA_CC
–   ACTION_MAIN             – ACTION_TIME_TICK              –   EXTRA_CHANGED_COMPONENT_NAME
–   ACTION_VIEW             – ACTION_TIME_CHANGED           –   EXTRA_DATA_REMOVED
–   ACTION_ATTACH_DATA – ACTION_TIMEZONE_CHANGED            –   EXTRA_DOCK_STATE
–   ACTION_EDIT             – ACTION_BOOT_COMPLETED         –   EXTRA_DOCK_STATE_CAR
–   ACTION_PICK             – ACTION_PACKAGE_ADDED          –   EXTRA_DOCK_STATE_DESK
–   ACTION_CHOOSER          – ACTION_PACKAGE_CHANGED        –   EXTRA_DOCK_STATE_UNDOCKED
–   ACTION_GET_CONTENT – ACTION_PACKAGE_REMOVED             –   EXTRA_DONT_KILL_APP
–   ACTION_DIAL             – ACTION_PACKAGE_RESTARTED      –   EXTRA_EMAIL
–   ACTION_CALL             – ACTION_PACKAGE_DATA_CLEA      –   EXTRA_INITIAL_INTENTS
–   ACTION_SEND                 RED                         –   EXTRA_INTENT
–   ACTION_SENDTO           – ACTION_UID_REMOVED            –   EXTRA_KEY_EVENT
–   ACTION_ANSWER           – ACTION_BATTERY_CHANGED        –   EXTRA_PHONE_NUMBER
–   ACTION_INSERT           – ACTION_POWER_CONNECTED        –   EXTRA_REMOTE_INTENT_TOKEN
–   ACTION_DELETE           – ACTION_POWER_DISCONNECT       –   EXTRA_REPLACING
    ACTION_RUN                  ED
–                                                           –   EXTRA_SHORTCUT_ICON
    ACTION_SYNC             – ACTION_SHUTDOWN
–                                                           –   EXTRA_SHORTCUT_ICON_RESOURCE
–   ACTION_PICK_ACTIVITY                                    –   EXTRA_SHORTCUT_INTENT
–   ACTION_SEARCH                                           –   EXTRA_STREAM
–   ACTION_WEB_SEARCH                                       –   EXTRA_SHORTCUT_NAME
–   ACTION_FACTORY_TEST                                     –   EXTRA_SUBJECT
     // インテントによるブラウザ起動の例                                    –   EXTRA_TEMPLATE
     Uri uri = Uri.parse("http://probsc.jp");               –   EXTRA_TEXT
     Intent intent = new Intent(Intent.ACTION_VIEW, uri);   –   EXTRA_TITLE
     startActivity(intent);                                 –   EXTRA_UID              23
インテントは空も飛ぶんです!
Chrome to Phone

                      おもむろにクリック!




                  Androidでブラウズ
                                 24
空飛ぶインテントの正体は...
? Cloud to Device Messaging (C2DM)
 – サーバからAndroidアプリケーションへの軽量
   メッセージの送信を助けるサービス
 – メッセージはキューイングされるが順序保証なし
 – ア プ リ は 常 時 起 動 の 必 要 は な く 、 Intent
   Broadcastをトリガーに起動される
 – 処理方法はアプリに依存
 – Android2.2 (Froyo) が必要
 – Googleアカウントの設定と接続が必要
                                      25
颁2顿惭のアーキテクチャ
                           Google C2DM Servers

                                                  1. (Register)
                                                   Sender ID / Application
4. (POST
                                                2. Registration ID
 https://android.apis.google.com/c2dm/send)
                                                  (定期的に更新)
 Registration ID / data.<key>
                                              5. Message
                                                               App
                                 3. Registration ID
                                                           Application ID
                                   (定期的に更新)
Third-Party                                                 Sender ID
Application Server                            6. Intent
                                                          Mobile Device
                                                                      26
青空読手でのインテント活用
? 青空文庫サイトから書籍データをダウンロードするための
  アプリ。リーダー機能は備えていない
             ×
? 青空文庫リーダーアプリ。書籍データへのリンクは予め収
  録したランキング。任意データ取得は不可




                               27
暗黙的インテントを受け取るためのManifest宣言
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
  package="com.gmail.hyukix.aozorayomite" android:versionName="0.9.8.2"
  android:versionCode=“10”>
  ???
  <application android:icon=“@drawable/icon” android:label=“@string/app_name”>
     <activity android:name=".AozoraYomite" android:label="@string/app_name"
        android:screenOrientation=“portrait”>
        <intent-filter><action android:name=“android.intent.action.MAIN” />
          <category android:name=“android.intent.category.LAUNCHER” /></intent-filter>
     </activity>
     <activity android:name=".Reader" android:label="@string/app_name"
        android:screenOrientation="portrait">
       <intent-filter>
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <!-- file://xxxxのようなリクエストを受け付ける -->
          <data android:scheme="file" android:mimeType="text/plain" />
       </intent-filter>
     </activity>
     ???
  </application>
  ???
</manifest>
                                                                                         28
Activityでのインテント判定と処理振り分け
package com.gmail.hyukix.aozorayomite;
  ???
public class Reader extends Activity {
      ???
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
         ???
     if (Intent.ACTION_VIEW.equals(getIntent().getAction())) {
         // 暗黙的インテント
            ???
      } else {
         // 明示的インテント
            ???
      }
         ???
  }
      ???
}




                                                                 29
マネタイズ
この1年で…




出典:http://www.apple.com/jp/macbookair/   31
DL 数が伸びないことには...
                     ①   ②   ③




① アンドロイダー レビュー記事
② アンドロイダー 青空文庫比較記事
③ au one market 登録               32
昨年度末の盛り上がり!




              33
今後ともどうぞよろしくお願いします
? ハンドアウト
 – http://bit.ly/nodakK
   (3.3MB)

? 青空読手 ver0.9.8.16
 (野良アプリ版)
 – http://bit.ly/nvkHfM
   (267KB)

? 青空読手 ver0.9.8.16
 (AndroidMarket)

                          34

More Related Content

AOZORAYOMITE and Intent

  • 1. 青空読手とインテント 2011/09/30(金)@東北支部発信会 樋口 祐紀 (@hyukix / hyukix@gmail.com)
  • 3. 自己绍介 名前: 樋口 祐紀 (ひぐち ゆうき) 年齢: 31歳 (1980/02/08) 出身: 三重県四日市市 所属: (株)PRO&BSC 趣味: 10年前までは... 3
  • 6. 青空読手のご紹介① 作者一覧やランキングから選択 文庫の表示 もちろんしおり機能も 6
  • 7. 青空読手のご绍介② サイズ: 極大 + 太さ: 極太 サイズ: 極小 + 太さ: 極細 文字のサイズと太さの指定 7
  • 8. 青空読手のご绍介③ SDカードや本体内の テキストの読み込みも可能 横向き表示にも対応 8
  • 9. mobile ASCII vol.5に掲載! 2011/7/29発行 9
  • 10. PLUTINUM Prize 頂きました! 10
  • 11. ディベロッパーコンソール 端末 国 1 Samsung Galaxy S 12.5% (14,561) 1 日本 98.3% (114,643) 2 Sharp IS03 10.7% (12,507) 2 アメリカ合衆国 0.4% (481) 3 Fujitsu Toshiba REGZA Phone T01C 8.8% (10,219) 3 中国 0.3% (321) 4 SEMC Xperia X10 6.8% (7,946) 4 大韓民国 0.2% (224) 5 Samsung Galaxy Tab 6.5% (7,544) 5 台湾 0.2% (214) 6 SO-02C 6.4% (7,485) 6 香港 0.1% (98) 7 SEMC Xperia Arc 6.3% (7,313) 7 タイ 0.1% (84) 8 Samsung Galaxy S2 4.3% (4,959) 8 イギリス 0.1% (71) 9 Sharp IS01 3.1% (3,599) 9 オーストラリア 0.0% (52) 10 Sharp Lynx 3D SH-03C 3.0% (3,455) 10 シンガポール 11 0.0% (51)
  • 13. どうやって作ってるの!?① ? データは青空文庫サイト *1 から zipファイルをDL後、解凍 – 500文庫分のzipファイルへのリン クを保持 ? フォントは「IPA明朝」をダウン ロードして利用 ? SurfaceViewで頑張って描画 – (背景+本文+ルビ+タイトル +ページ数)x 2 *1 … http://www.aozora.gr.jp/ 13
  • 15. どうやって作ってるの!?③ ? Twitterへのつぶやき投稿はこんなにかんたん! final String msg = " 『坊っちゃん』なう #aozorayomite"; final Uri uri = Uri.parse( http://twitter.com/home/?status= + URLEncoder.encode(msg, "UTF-8")); final Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); 15
  • 16. どうやって作ってるの!?④ def get_or_post(self): pdev = self.request.get('dev').encode('utf-8') pos = self.request.get('os').encode('utf-8') pver = self.request.get('ver').encode('utf-8') ptitle = self.request.get('title').encode('utf-8') pbug = self.request.get('bug').encode('utf-8') report = "dev: " + pdev + "?n" report += "os: " + pos + "?n" report += "ver: " + pver + "?n" report += "title: " + ptitle + "?n" report += "bug: " + pbug mail.send_mail( sender='hyukix@gmail.com', to='hyukix@gmail.com', subject='Bug Report - AozoraYomite', body=report) 【参考サイト】throw Life - Androidアプリのバグ報告システムを考える http://www.adamrocker.com/blog/288/bug-report-system-for-android.html 16
  • 18. 突然ですがクイズです ? Twitter / Evernote / メールを利用し、 任意の文字列を送信するAndroidアプ リを作るのに必要な時間は? A. 3分 B. 3時間 C. 3日 D. Androidでは無理... だけど... 3秒でできるよ。そう、iPhoneならね 18
  • 19. これだけ書けば解決! public class Test extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new AlertDialog.Builder(this).setMessage("Start activity ?") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, "Hello, Android!!"); startActivity(intent); } }).setNegativeButton("No", null).show(); } } 19
  • 20. This is Android!! Evernote IMoNi twicca 20
  • 22. インテントって何? ? 処理依頼メッセージのこと – 例: AK Notepadによる他アプリ機能 AK Notepadにてテキ ACTION_SEND イ ン Twidroidにペーストさ ストを入力。メニューから テ ン トが発行 さ れ 、 対 れる。ポイントは相互連 Shareを指定すると… 応アプリがリストアップ 携を前提としてない点 出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc 22
  • 23. Extra Data IntentとExtraData – – EXTRA_ALARM_COUNT EXTRA_BCC Activity Actions Broadcast Actions – EXTRA_CC – ACTION_MAIN – ACTION_TIME_TICK – EXTRA_CHANGED_COMPONENT_NAME – ACTION_VIEW – ACTION_TIME_CHANGED – EXTRA_DATA_REMOVED – ACTION_ATTACH_DATA – ACTION_TIMEZONE_CHANGED – EXTRA_DOCK_STATE – ACTION_EDIT – ACTION_BOOT_COMPLETED – EXTRA_DOCK_STATE_CAR – ACTION_PICK – ACTION_PACKAGE_ADDED – EXTRA_DOCK_STATE_DESK – ACTION_CHOOSER – ACTION_PACKAGE_CHANGED – EXTRA_DOCK_STATE_UNDOCKED – ACTION_GET_CONTENT – ACTION_PACKAGE_REMOVED – EXTRA_DONT_KILL_APP – ACTION_DIAL – ACTION_PACKAGE_RESTARTED – EXTRA_EMAIL – ACTION_CALL – ACTION_PACKAGE_DATA_CLEA – EXTRA_INITIAL_INTENTS – ACTION_SEND RED – EXTRA_INTENT – ACTION_SENDTO – ACTION_UID_REMOVED – EXTRA_KEY_EVENT – ACTION_ANSWER – ACTION_BATTERY_CHANGED – EXTRA_PHONE_NUMBER – ACTION_INSERT – ACTION_POWER_CONNECTED – EXTRA_REMOTE_INTENT_TOKEN – ACTION_DELETE – ACTION_POWER_DISCONNECT – EXTRA_REPLACING ACTION_RUN ED – – EXTRA_SHORTCUT_ICON ACTION_SYNC – ACTION_SHUTDOWN – – EXTRA_SHORTCUT_ICON_RESOURCE – ACTION_PICK_ACTIVITY – EXTRA_SHORTCUT_INTENT – ACTION_SEARCH – EXTRA_STREAM – ACTION_WEB_SEARCH – EXTRA_SHORTCUT_NAME – ACTION_FACTORY_TEST – EXTRA_SUBJECT // インテントによるブラウザ起動の例 – EXTRA_TEMPLATE Uri uri = Uri.parse("http://probsc.jp"); – EXTRA_TEXT Intent intent = new Intent(Intent.ACTION_VIEW, uri); – EXTRA_TITLE startActivity(intent); – EXTRA_UID 23
  • 24. インテントは空も飛ぶんです! Chrome to Phone おもむろにクリック! Androidでブラウズ 24
  • 25. 空飛ぶインテントの正体は... ? Cloud to Device Messaging (C2DM) – サーバからAndroidアプリケーションへの軽量 メッセージの送信を助けるサービス – メッセージはキューイングされるが順序保証なし – ア プ リ は 常 時 起 動 の 必 要 は な く 、 Intent Broadcastをトリガーに起動される – 処理方法はアプリに依存 – Android2.2 (Froyo) が必要 – Googleアカウントの設定と接続が必要 25
  • 26. 颁2顿惭のアーキテクチャ Google C2DM Servers 1. (Register) Sender ID / Application 4. (POST 2. Registration ID https://android.apis.google.com/c2dm/send) (定期的に更新) Registration ID / data.<key> 5. Message App 3. Registration ID Application ID (定期的に更新) Third-Party Sender ID Application Server 6. Intent Mobile Device 26
  • 27. 青空読手でのインテント活用 ? 青空文庫サイトから書籍データをダウンロードするための アプリ。リーダー機能は備えていない × ? 青空文庫リーダーアプリ。書籍データへのリンクは予め収 録したランキング。任意データ取得は不可 27
  • 28. 暗黙的インテントを受け取るためのManifest宣言 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.gmail.hyukix.aozorayomite" android:versionName="0.9.8.2" android:versionCode=“10”> ??? <application android:icon=“@drawable/icon” android:label=“@string/app_name”> <activity android:name=".AozoraYomite" android:label="@string/app_name" android:screenOrientation=“portrait”> <intent-filter><action android:name=“android.intent.action.MAIN” /> <category android:name=“android.intent.category.LAUNCHER” /></intent-filter> </activity> <activity android:name=".Reader" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <!-- file://xxxxのようなリクエストを受け付ける --> <data android:scheme="file" android:mimeType="text/plain" /> </intent-filter> </activity> ??? </application> ??? </manifest> 28
  • 29. Activityでのインテント判定と処理振り分け package com.gmail.hyukix.aozorayomite; ??? public class Reader extends Activity { ??? public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ??? if (Intent.ACTION_VIEW.equals(getIntent().getAction())) { // 暗黙的インテント ??? } else { // 明示的インテント ??? } ??? } ??? } 29
  • 32. DL 数が伸びないことには... ① ② ③ ① アンドロイダー レビュー記事 ② アンドロイダー 青空文庫比較記事 ③ au one market 登録 32
  • 34. 今後ともどうぞよろしくお願いします ? ハンドアウト – http://bit.ly/nodakK (3.3MB) ? 青空読手 ver0.9.8.16 (野良アプリ版) – http://bit.ly/nvkHfM (267KB) ? 青空読手 ver0.9.8.16 (AndroidMarket) 34