fc2ブログ

戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
5
6
7
8
9
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
11

外部領域へのアクセス権限と Android 4.4 KitKat

Android では外部領域(内部ストレージ/外部ストレージ)へアクセスするためには、アクセスを行うアプリ毎に WRITE_EXTERNAL_STORAGE または READ_EXTERNAL_STORAGE をパーミッションに設定する必要があります。

パーミッションを設定せずに外部領域にアクセスすると SecurityException が発生します。

Android 4.4 (KitKat / API 19) からはこの外部領域における、自身のアプリケーション領域 Context#getExternalFilesDir(String type) へはパーミッションなしでもアクセスできるようになりました。
ただし、このアクセス許可は自身のアプリケーション領域のみを対象としており、全てのアプリケーションが共有する領域 Environment#getExternalStoragePublicDirectory(String type) は対象外となります。

【アプリケーションの外部領域】
 <外部領域>/Android/data/<package_name>/files/

例1)HTC J ISW13HT Android 4.0(非マルチユーザー)
  /mnt/sdcard/Android/data/jp.inujirushi.android.sample/files/
例2)Nexus7 (2012) Android 4.3(マルチユーザー)
  /storage/emulated/0/Android/data/jp.inujirushi.android.sample/files/

【外部領域へのアクセス権限(パーミッション)】
外部領域へのアクセス権限は、外部領域にある全てのファイルが対象となります。

WRITE_EXTERNAL_STORAGE
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
アプリケーションが外部領域へアクセスし、ファイルへの書き込み、および、読み込みを行うことを許可します。
読み込みも許可されるため READ_EXTERNAL_STORAGE の指定は不要です。

READ_EXTERNAL_STORAGE
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
アプリケーションが外部領域へアクセスし、ファイルの読み込みを行うことを許可します。
このパーミッションは Android 4.1 (JellyBean API 16) で「予約された権限」として追加されており、開発者向けオプションのSDカード保護にチェックを入れない限り有効になりませんでした。
Android 4.4 で正式に対応された形になります。


■ 参考サイト
Taosoftware - Android:KitkatのREAD_EXTERNAL_STORAGEと外部記憶領域
TechBooster - Android 4.4で追加されたパーミッションとDevice Features
Yukiの枝折 - Android:JBで追加されたREAD_EXTERNAL_STORAGE
スポンサーサイト



ネットワーク通信ライブラリ : Volley

Google I/O 2013 で Android のネットワーク通信処理を行う Volley ライブラリが発表・公開されました。

すでに公開から半年近く経っているため今更感もありますが簡単に使い方を書いていきます。
(Google I/O 2013 は 2013/05/16 開催)


■ Volley とは
Volley はネットワーク通信処理を簡単に、そして、早く実装することができるライブラリです。
Volley ではネットワーク通信は非同期で処理され、リクエストのコールバックは UIスレッドで処理されます。
その他、メモリキャッシュとディスクキャッシュ、リクエストの優先順位付けなど行うことが出来ます。

ただし、レスポンス全体がメモリに確保されるため、大きなファイルやストリーミング処理には適さないようです。


■ Volley ライブラリを取得する
Volley ライブラリは Git リポジトリで公開されているため、Git を使ってインポートする必要があります。
( Git がない人はインストールしてください → git GUI Clients :: http://git-scm.com/downloads )
git clone https://android.googlesource.com/platform/frameworks/volley

clone で取得したプロジェクトは Android プロジェクトとしてインポートします。
このプロジェクトは Is Library にチェックが入っていないため、チェックを入れてから使用してください。

※リソースファイルがないため、Jarファイルにエクスポートして取り込むことも出来ます。


■ Volley ライブラリを使う!
Volley はネットワーク通信を行うので、AndroidManifest.xml にネットワーク許可のパーミッションを追加します。
<uses-permission android:name="android.permission.INTERNET" />

実際に HTTPリクエストを行ってデータを取得するには以下のように行います。
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

public class SampleActivity extends Activity {

private RequestQueue mQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 取得した文字列を表示する TextView を生成する
final TextView textView = new TextView(this);
setContentView(textView);

// HTTPリクエストを行う Queue を生成する
mQueue = Volley.newRequestQueue(this);

// 指定したURLから文字列を取得する
String url = "http://inujirushi123.blog.fc2.com/?xml";
mQueue.add(new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
}, null));
}
}
ここでは文字列を取得していますが、30行目で渡す StringRequest を変更することで様々な形式でデータを取得できます。

用意されているリクエスト
ClearCacheRequest
ImageRequest
JsonRequest (JSON処理用の抽象クラス)
JsonArrayRequest
JsonObjectRequest
StringRequest

Volley では上記のリクエストが用意されていますが Request クラスを継承することで独自の Request クラスを作ることも出来ます。
例えば、Villey では XML 用のリクエストが用意されていないため Request クラスを拡張する必要があります。
実装方法は Y.A.M の雑記帳 - Volley を使って XML を処理する がとても参考になります。


Volley では画像取得用に ImageRequest が用意されていますが、NetworkImageView という ImageView の拡張クラスも用意されています。
次のサンプルソースの30行目の引数で new ImageCache() を渡しているところでキャッシュ処理を行います。
null を渡すと NullPointerExcepton が発生するため、キャッシュ不要の場合でも定義する必要があります。
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

public class SampleActivity extends Activity {

private RequestQueue mQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Volley に用意された ImageView の拡張クラス NetworkImageView を生成する
NetworkImageView imageView = new NetworkImageView(this);
setContentView(imageView);

// HTTPリクエストを行う Queue を生成する
mQueue = Volley.newRequestQueue(this);

// 指定したURLから画像を取得する
String url = "http://source.android.com/images/Android_Robot_100.png";
imageView.setImageUrl(url, new ImageLoader(mQueue, new ImageCache() {
// キャッシュ処理が必要な場合はここに記述します
@Override
public void putBitmap(String url, Bitmap bitmap) {
}

@Override
public Bitmap getBitmap(String url) {
return null;
}
}));
}
}


と、Volley を試してみましたが通信処理が簡単に実装できて良いですね!
最初に書いたように大きなファイルやストリーミング処理に適さないため、全ての通信処理で Volley を使うというわけには行きませんが、率先して使っていこうかと思います。


■ 参考サイト
throw Life - Volley(AndroidのHTTP通信ライブラリ)を使おう
TechBooster - ネットワーク通信用ライブラリVolleyを使いこなす
Y.A.M の雑記帳 - Google I/O 2013 - Android : Volley: Easy, Fast Networking for Android
Y.A.M の雑記帳 - Volley を使って XML を処理する
クラスメソッド Developers.IO - Android Tips #51 ネットワーク通信・キャッシュ処理をより速く、簡単に実装できるライブラリ “Volley” を使ってみた
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始