アプリケーション 制 作 において 使 用 しているクラスやメソッドの 効 果 の 説 明 や その 利 用 例 を 記 述 しています 藤 本 大 樹 2013/10/17
アンドロイドアプリ 開 発 における 中 核 を 担 っているのは webview である. webview ( Added in API level 1 ) ってなに? 構 成 java.lang.object >> android.view.view >> android.view.viewgroup >> android.widget.absolutelayout >> android.webkit.webview webview は 以 下 の 特 徴 を 持 っている. 1. View コンポーネントの ViewGroup(*1)クラスのサブクラスに 位 置. 2. WebView は,ネット 上 及 びローカルストレージ 内 部 に 保 存 された web ページのデータ( 主 に HTML CSS JavaScript)を 元 に,web ページを 画 面 に 出 力 するクラスのオブジェクトを 生 成 する. 3. webkit のレンダリングエンジンを 使 用.(*2) 4. コンストラクタは 3 種 類 が 用 意 されている I. WebView(Context context) 今 回 はここを 使 用 (ソース 内 では webview = new WebView(this); で 使 用 ) II. WebView(Context context, AttributeSet attrs, Map inflateparams) III. WebView(Context context, AttributeSet attrs, Map inflateparams, int defstyle) 今 回 のアプリのどこ 部 分 に 利 用 しているかというと, 右 の 図 のマー クしている 個 所 である. 初 期 の 状 態 では 以 下 の 事 ができる(またはできない). ズームができる( 自 動 的 に 拡 大 されない 為 HTML が 崩 れる) スクロールバー 分 の 表 示 幅 が 自 動 で 取 られる JavaScript が 実 行 できない flash( 端 末 内 の Flash Player for Android)が 再 生 できない web 前 提 であるのにインターネットに 繋 がらない URL の Path を 入 力 しなければ Web ページの 表 示 ができない 表 示 した Web ページのリンクをクリックすると, ( 標 準 以 外 のブラウザ 導 入 している 場 合 ) 別 ブラウザにリンクから 抽 出 した URL をインスタンスとして 自 動 的 に 渡 して, 以 後 は 別 ブラウザによる 処 理 としてしまう. 図 1 WebView 2
今 回 のアプリでは web ページであるコンテンツには CSS3 を 中 心 とした 管 理 に 置 いており,レスポンシブな 対 応 とリキッドレイアウトを 採 用 している. しかし,ズームが 可 能 であったり,スクロールバー 分 の 表 示 幅 が 自 動 で 取 られてしまうと 本 来 の 目 的 通 りの 表 示 が 困 難 になる 問 題 や,HTML5 と CSS3 と JavaScript または flash( 予 定 )によるコンテンツ 側 の 構 成 をしているの に 対 して,JavaScript または flash が 動 かないとなるとアプリとして 機 能 しなくなってしまう 問 題. 最 後 の,イン ターネットが 繋 がらない 為,ネットワーク 連 動 型 アプリとしての 設 計 の 根 底 を 覆 す 問 題 が 発 生 した. 前 者 2 つの 問 題 の 対 応 として webview に 含 まれているパブリックメソッドの 中 にある getsettings クラス(*3)に 内 包 されている 命 令 と view クラスで 利 用 できる 命 令 を webview を 使 用 している Activity の oncreate の 中 に 記 述 する 事 で 対 策 ができることがわかった. 記 述 タイミングとしてはwebviewを 生 成 し 表 示 をする 命 令 が 実 行 されるまでの 間 での 記 述 がブラウザの 設 定 に 問 題 が 発 生 しにくい, 具 体 的 には 以 下 のソースの 通 りである /*----ブラウザ 処 理 ----*/ private WebView webview; webview = new WebView(this); //インスタンスを 設 定 している thisはメインactivityないしは 内 包 するActivityを 指 す /*----webview 設 定 ----*/ webview.getsettings().setjavascriptenabled(true); //webview 上 でのJSの 起 動 を 許 可 するか?(true)しないか?(false) //flashを 通 すためのプラグイン: Android 2.1で 実 行 また PluginStateクラスを 参 照 でアプリが 強 制 終 了 する, 注 意 webview.getsettings().setpluginstate(pluginstate.on); webview.getsettings().setsupportzoom(false); //ズームするか?(true)しないか?(false) webview.setscrollbarstyle(webview.scrollbars_inside_overlay); //スクロールのバー 防 止 今 回 使 用 したのは,WebSettingの 設 定 を 変 更 する 以 下 の3 種 類 のパブリックメソッドと,Viewクラスの 設 定 を 変 えるパブリックメソッドである. setjavascriptenabled( boolean flag ) setpluginstate( WebSettings.PluginState state ) setsupportzoom( boolean support ) setscrollbarstyle(int) 3
メソッド 説 明 ( WebSetting ) setjavascriptenabled( boolean flag(*4) ) public synchronized void(*5)の 一 つ,WebView における JavaScript の 実 行 を 有 効 にするメソッドである. デフォルトの 状 態 では false( 偽 )の 値 が 代 入 されており,JavaScript が 使 えない 状 態 から 始 まる. 使 用 する 場 合 には boolean flag と 記 述 されているとおり,true( 真 )/false( 偽 ) = ON/OFF の 役 割 を 持 つことと, インスタンスを 取 得 した 名 前 の 設 定 を 呼 び 出 す 必 要 がある. 具 体 的 には 下 の webview が 取 得 した 名 前 となる. WebView webview = new WebView(this); webview.getsettings().setjavascriptenabled(true);.getsettings().setjavascriptenabled(δ);を 記 述 する 前 には,WebViewインスタンスを 取 得 しておく 必 要 がある. setpluginstate( WebSettings.PluginState state(*6) ) ~API_18から 非 推 奨 対 象 ~ public synchronized void(*5)の 一 つ,WebViewでのプラグインが 埋 め 込 まれたコンテンツ(Flash)を 扱 う 事 が 出 来 るメソッド.デフォルトではOFFが 入 っている 為, 設 定 していない 場 合 はFlashは 起 動 しないようになっている. 無 効 にしている 場 合 は 本 来 プラグインが 表 示 される 場 所 にはプレースホルダが 代 入 される. 有 効 にしている 場 合 であればプレースホルダの 場 所 にプラグインマークが 表 示 され,クリックされた 瞬 間 から プラグインが 有 効 になる. 有 効 にしたからといってクリック 無 しにプラグインが 起 動 する 訳 ではないことを 留 意. 使 用 する 場 合 には,setJavaScriptEnabledの 時 と 同 様 にインスタンスを 取 得 した 名 前 の 設 定 を 呼 び 出 す.stateを ONかON_DEMANDにすることで 指 定 されたWebView 上 でのFlashの 使 用 が 許 可 される. webview.getsettings().setpluginstate(pluginstate.on); 4
setsupportzoom( boolean support ) public void の 一 つ,WebView 上 の 画 面 における ズーム 等 のボタンによる 操 作 と マルチタップ 時 でのピン チイン/アウトのジェスチャーによるズームの 操 作 を 有 効 にするか 無 効 にするかを 設 定 するメソッド. 設 定 には boolean であることから true( 真 )と false( 偽 )の 値 によって 有 効 か 無 効 かが 決 定 する.デフォルトでは true( 真 )が 入 っており,ズームが 初 期 から 可 能 になるように 設 定 がなされている. 使 用 する 場 合 には,setJavaScriptEnabled の 時 と 同 様 にインスタンスを 取 得 した 名 前 の 設 定 を 記 述 し, 下 のソー スの 様 に true( 真 )または false( 偽 )を 入 力 することにより 設 定 を 切 り 替 えることができる. webview.getsettings().setsupportzoom(false); 有 効 時 でのみ,デバイス 内 臓 のズーム 機 構 を 使 用 するかの 設 定 は setbuiltinzoomcontrols で 入 力 できる.デフォ ルトは false でが 設 定 されている 為,ズーム 機 構 を 使 用 する 場 合 は 事 前 に 有 効 にしておく 必 要 がある. メソッド 説 明 ( View) setscrollbarstyle( int style ) public void の 一 つであり,スクロールバーの 見 た 目 の 設 定 ができるメソッド. WebView 上 にスクロールバーを 重 ねて 表 示 したり,View の padding にスクロールバーの 幅 の 大 きさを 設 けて 埋 め 込 みをする 事 によって padding 領 域 内 か, 設 定 した View の 端 に 描 画 をする 処 理 を 挟 む 事 が 可 能 である. 全 体 描 画 するコンテンツの 場 合 はコンテンツ 内 容 が padding 領 域 によってずれたり, 画 面 サイズによって 行 う 判 定 が 困 難 になることがあるので 留 意 しておく 必 要 がある. style に 入 力 できる 値 は 以 下 の 4 種 類 であり,それぞれ 表 示 による 効 果 が 違 う. ( 水 平 スクロールバーも 垂 直 スクロールバーもこの 選 択 で 両 方 が 変 更 される) 1 SCROLLBARS_INSIDE_OVERLAY 2 SCROLLBARS_INSIDE_INSET 3 SCROLLBARS_OUTSIDE_OVERLAY 4 SCROLLBARS_OUTSIDE_INSET 5
INSIDE と OUTSIDE は padding 領 域 による 影 響 を 受 けるか 受 けないかの 違 いである. INSIDE:スクロールバーの 端 が padding 領 域 の 影 響 を 受 ける. OUTSIDE:スクロールバーの 端 が padding 領 域 の 影 響 を 受 けない. OVERLAY と INSET はスクロールバーの 幅 の 領 域 確 保 をするかしないかの 違 いである. OVERLAY:スクロールバーの 幅 の 領 域 を 確 保 しない. INSET:スクロールバーの 幅 の 領 域 を 確 保 する. 使 用 する 場 合 には,インスタンスを 取 得 した 名 前 の 設 定 を 記 述 し,4 種 類 のうち 一 つを 入 力 することにより 設 定 をすることができる. 図 2 Style webview.setscrollbarstyle(webview.scrollbars_inside_overlay); 6
後 者 の インターネットが 繋 がらない 問 題 であるが, 当 初 URL を 指 定 し Webkit 使 用 WebView を 起 動 したと ころ Socket エラーが 発 生 した.アプリケーションエラーとして 出 ておらず 原 因 が 分 からずにいたが,Android Developers で 通 信 に 関 して 探 したところ, 解 決 の 糸 口 を 発 見 した. AndroidManifest.xml のルート 要 素 の 一 つ Manifest の 中 に 存 在 する uses-permission というものが 存 在 している. uses-permission は,アプリケーションの 機 能 が 適 切 に 動 作 する 為 にユーザ 側 からの 許 可 をインストール 時 に 要 求 し, 許 可 を 得 たアプリケーションは 許 可 を 得 た 範 囲 での 機 能 を 適 切 に 動 作 させる 事 ができるというもので ある. つまり,uses-permission の 個 所 に インターネットの 許 可 の 申 請 をする 記 述 をしない 限 り android 端 末 による アプリケーションのインストールの 段 階 で,インターネットを 利 用 した 通 信 ができない ということが 発 覚 した. そして AndroidManifest.xml(*7)にインターネット 接 続 に 関 する 許 可 を 取 るように 設 定 することで 解 決 した.そ の 方 法 は 2 種 類 存 在 する. 1. AndroidManifest.xml に 直 接 以 下 の 処 理 を 記 述 する 方 法. 1 AndroidManifest.xml を 開 き 下 側 に 存 在 する AndroidManifest.xml を 開 く. 2 uses-sdk の 上 部 に 以 下 の 処 理 を 記 述 することで 解 決 する. <uses-permission android:name="android.permission.internet"/> 2. AndroidManifest.xml の 許 可 からパーミッションの 追 加 をする 方 法. 1 AndroidManifest.xml を 開 き 下 側 に 存 在 する 許 可 を 開 く. 2 追 加 のボタンを 押 す. 3 選 択 できる 中 から uses-permission をクリックし,uses-permission を 作 成 する. 4 作 成 した uses-permission をクリックし, 右 側 の 枠 に 存 在 する Name より"android.permission.INTERNET" を 選 択 する. 7
*1:ViewGroup クラスのサブクラスには, 主 に AbsoluteLayout などのように, 他 のビューを 内 部 に 持 つクラスが 存 在 する. *2:Android の 標 準 ブラウザは Webkit に 含 まれる JavaAPI によって 作 られている. そのため ${Android_Src}/framework/base/core/java/android/webkit に Java 実 装 ソースが 存 在 する. Webkit は C++で 作 成 されている, Android Platform(Java)では Java Native Interface(JNI)を 使 用 し 実 行 可 能 にしている. Android Prject の ${Android_Src}/external/webkit にてソース 管 理 をしており webkit の 変 更 点 を 取 り 入 れる 処 理 が 存 在. 余 談 )webkit2 を 使 用 しない 理 由 は,android 自 身 にハンドラ(UI)が 既 に 存 在 しており,レンダリング 処 理 のみが 必 要 だった. *3:WebSetting と 呼 ばれる public abstract class の 拡 張 オブジェクトが 存 在 しており,WebView 内 の 設 定 状 態 を 管 理 する. webview が 呼 び 出 されたときに 初 期 値 (デフォルト)のセットが 自 動 的 に 取 得 され,それが 初 期 設 定 として 機 能 する. 開 発 者 側 で WebView.getSettings( )と WebSetting のパブリックメソッドで,WebView の 設 定 状 態 の 変 更 が 可 能 である. *4:boolean flag とは,まず boolean は 2 つの 値 しか 取 らない 型 を 指 し, ブーリアン と 読 む. そして flag とは 変 数 であり,その 中 には 2 つの 値 である True( 真 )と False( 偽 ) 以 外 は 入 力 を 受 け 付 けない. 変 数 flag はコーディングルールとして True( 真 )と False( 偽 )が 入 るようにし, 変 数 として 他 の 文 字 や 数 字 に 使 わない. 余 談 )flag とは 旗 を 指 しており, 旗 の 上 げ 下 げに 例 えられてフラグと 呼 ばれるようになったそうな. *5:public synchronized void とは,public は すべてのクラスからの 参 照 を 許 可 を 指 定 する 修 飾 子 の 一 つである. synchronized は スレッドの 排 他 制 御 を 指 し, 複 数 スレッドの 同 時 処 理 を 行 う 事 がプログラム 処 理 結 果 上, 都 合 が 悪 い 場 合 オブジェクトのロック 権 を 獲 得 した, 単 一 スレッドのみでの 処 理 を 可 能 とします. 余 談 )スレッド 実 行 を 持 つ 複 数 のインスタンスが 存 在 する 場 合 は,インスタンス 個 数 分 を 多 重 に 実 行 することがあるので 注 意. void は メソッドの 戻 り 値 が 存 在 しない ことを 指 定 する 修 飾 子 の 一 つ 余 談 )Java では void を 修 飾 子 として 置 いた 場 合 C++や C#と 同 様 に return(メソッド 内 での 戻 り 値 を 返 す)を 書 かなくて 良 い. *6:WebSettings.PluginState state とは,public static final enum であり, 指 定 された ON OFF ON_DEMAND が state に 入 る. webkit で 使 用 する 表 示 プラグインを 有 効 にするかの 設 定 でありそれぞれ 以 下 の 効 果 を 持 つ. ON:プラグインをインストールしていなければ 有 効 にできない. OFF:プラグインをインストールしてもいなくても 無 効 にする. ON_DEMAND:プラグインをインストールまでして 有 効 にする. *7:AndroidManifest.xml はアプリケーションの 必 要 不 可 欠 とする 情 報 を 表 現 し,ユーザに 許 可 を 求 めるために 存 在 するファイル, このファイルに 記 述 された 内 容 をアプリケーションのコードが 実 行 される 前 に Android のシステムに 伝 え, 許 可 を 得 ることで, アプリ 側 が 制 限 された 機 能 などを 利 用 する 事 が 出 来 る. 参 考 サイト:Android Developers.com (Android Developers) 2013/10/16 webview http://developer.android.com/reference/android/webkit/webview.html View http://developer.android.com/reference/android/view/view.html uses-permission http://developer.android.com/guide/topics/manifest/uses-permission-element.html 8