自己紹介
自己紹介
名前: 樋口 祐紀
(ひぐち ゆうき)
年齢: 31歳
(1980/02/08)
出身: 三重県四日市市
所属: (株)PRO&BSC
趣味: 10年前までは...
3
Androidとの関わりは...
4
青空読手って!?
青空読手のご紹介①
6
作者一覧やランキングから選択 文庫の表示 もちろんしおり機能も
文字のサイズと太さの指定
サイズ: 極大 + 太さ: 極太 サイズ: 極小 + 太さ: 極細
7
青空読手のご紹介②
青空読手のご紹介③
8
横向き表示にも対応
SDカードや本体内の テキストの読み込みも可能
mobile ASCII vol.5に掲載!
9
2011/7/29発行
PLUTINUM Prize 頂きました!
10
ディベロッパーコンソール
11
端 末
1 Samsung Galaxy S 12.5% (14,561)
2 Sharp IS03 10.7% (12,507)
3 Fujitsu Toshiba REGZA Phone T01C 8.8% (10,219)
4 SEMC Xperia X10 6.8% (7,946)
5 Samsung Galaxy Tab 6.5% (7,544)
6 SO-02C 6.4% (7,485)
7 SEMC Xperia Arc 6.3% (7,313)
8 Samsung Galaxy S2 4.3% (4,959)
9 Sharp IS01 3.1% (3,599)
10 Sharp Lynx 3D SH-03C 3.0% (3,455)
国
1 日本 98.3% (114,643)
2 アメリカ合衆国 0.4% (481)
3 中国 0.3% (321)
4 大韓民国 0.2% (224)
5 台湾 0.2% (214)
6 香港 0.1% (98)
7 タイ 0.1% (84)
8 イギリス 0.1% (71)
9 オーストラリア 0.0% (52)
10 シンガポール 0.0% (51)
どうやって作ってるの?
どうやって作ってるの!?①
• データは青空文庫サイト*1からzipファイルをDL後、解凍
– 500文庫分のzipファイルへのリンクを保持
• フォントは「IPA明朝」をダウンロードして利用
• SurfaceViewで頑張って描画
– (背景+本文+ルビ+タイトル+ページ数)x 2
13 *1 … http://www.aozora.gr.jp/
どうやって作ってるの!?②
• Twitterによるつぶやき
14
どうやって作ってるの!?③
• Twitterへのつぶやき投稿はこんなにかんたん!
15
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);
どうやって作ってるの!?④
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='[email protected]', to='[email protected]', subject='Bug Report - AozoraYomite', body=report)
【参考サイト】throw Life - Androidアプリのバグ報告システムを考える http://www.adamrocker.com/blog/288/bug-report-system-for-android.html
どうやって作ってるの!?⑤
• 青空プロバイダとの連携機能
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
Evernote
IMoNi
twicca
This is Android!!
20
インテントって!?
インテントって何?
• 処理依頼メッセージのこと
– 例: AK Notepadによる他アプリ機能
AK Notepadにてテキストを入力。メニューからShareを指定すると…
ACTION_SEND イ ンテントが発行され、対応アプリがリストアップ
Twidroidにペーストされる。ポイントは相互連携を前提としてない点
出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc 22
IntentとExtraData Activity Actions
– ACTION_MAIN
– ACTION_VIEW
– ACTION_ATTACH_DATA
– ACTION_EDIT
– ACTION_PICK
– ACTION_CHOOSER
– ACTION_GET_CONTENT
– ACTION_DIAL
– ACTION_CALL
– ACTION_SEND
– ACTION_SENDTO
– ACTION_ANSWER
– ACTION_INSERT
– ACTION_DELETE
– ACTION_RUN
– ACTION_SYNC
– ACTION_PICK_ACTIVITY
– ACTION_SEARCH
– ACTION_WEB_SEARCH
– ACTION_FACTORY_TEST
Broadcast Actions – ACTION_TIME_TICK
– ACTION_TIME_CHANGED
– ACTION_TIMEZONE_CHANGED
– ACTION_BOOT_COMPLETED
– ACTION_PACKAGE_ADDED
– ACTION_PACKAGE_CHANGED
– ACTION_PACKAGE_REMOVED
– ACTION_PACKAGE_RESTARTED
– ACTION_PACKAGE_DATA_CLEARED
– ACTION_UID_REMOVED
– ACTION_BATTERY_CHANGED
– ACTION_POWER_CONNECTED
– ACTION_POWER_DISCONNECTED
– ACTION_SHUTDOWN
Extra Data – EXTRA_ALARM_COUNT
– EXTRA_BCC
– EXTRA_CC
– EXTRA_CHANGED_COMPONENT_NAME
– EXTRA_DATA_REMOVED
– EXTRA_DOCK_STATE
– EXTRA_DOCK_STATE_CAR
– EXTRA_DOCK_STATE_DESK
– EXTRA_DOCK_STATE_UNDOCKED
– EXTRA_DONT_KILL_APP
– EXTRA_EMAIL
– EXTRA_INITIAL_INTENTS
– EXTRA_INTENT
– EXTRA_KEY_EVENT
– EXTRA_PHONE_NUMBER
– EXTRA_REMOTE_INTENT_TOKEN
– EXTRA_REPLACING
– EXTRA_SHORTCUT_ICON
– EXTRA_SHORTCUT_ICON_RESOURCE
– EXTRA_SHORTCUT_INTENT
– EXTRA_STREAM
– EXTRA_SHORTCUT_NAME
– EXTRA_SUBJECT
– EXTRA_TEMPLATE
– EXTRA_TEXT
– EXTRA_TITLE
– EXTRA_UID
// インテントによるブラウザ起動の例
Uri uri = Uri.parse("http://probsc.jp");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
23
インテントは空も飛ぶんです!
24
Androidでブラウズ
おもむろにクリック!
Chrome to Phone
空飛ぶインテントの正体は...
• Cloud to Device Messaging (C2DM)
–サーバからAndroidアプリケーションへの軽量
メッセージの送信を助けるサービス
–メッセージはキューイングされるが順序保証なし
–アプリは常時起動の必要はなく、 Intent
Broadcastをトリガーに起動される
–処理方法はアプリに依存
–Android2.2 (Froyo) が必要
–Googleアカウントの設定と接続が必要
25
Mobile Device
App
Sender ID
Application ID
C2DMのアーキテクチャ
26
Third-Party Application Server
Google C2DM Servers
1. (Register) Sender ID / Application
2. Registration ID (定期的に更新)
3. Registration ID (定期的に更新)
4. (POST https://android.apis.google.com/c2dm/send) Registration ID / data.<key>
5. Message
6. Intent
青空読手でのインテント活用
• 青空文庫サイトから書籍データをダウンロードするためのアプリ。リーダー機能は備えていない
× • 青空文庫リーダーアプリ。書籍データへのリンクは予め収
録したランキング。任意データ取得は不可
27
28
<?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>
暗黙的インテントを受け取るためのManifest宣言
29
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 {
// 明示的インテント
・・・
}
・・・
}
・・・
}
Activityでのインテント判定と処理振り分け
マネタイズ
この1年で…
31 出典:http://www.apple.com/jp/macbookair/
DL 数が伸びないことには...
32
① ② ③
① アンドロイダー レビュー記事 ② アンドロイダー 青空文庫比較記事 ③ au one market 登録
昨年度末の盛り上がり!
33
今後ともどうぞよろしくお願いします
• ハンドアウト
– http://bit.ly/nodakK (3.3MB)
• 青空読手 ver0.9.8.16 (野良アプリ版)
– http://bit.ly/nvkHfM (267KB)
• 青空読手 ver0.9.8.16 (AndroidMarket)
34