Androidにおける利用者情報アクセスに関わるパーミッションおよびAPI
研究に必要なのでAndroid端末における利用者情報の取得方法の一覧を纏めておく。
端末ID(IMEI), 加入者ID(IMSI), SIMシリアルID(ICCID) ,電話番号
パーミッション
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
コード
TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); // IMEIの取得 String imei = tm.getDeviceId(); // IMSIの取得 String imsi = tm.getSubscriberId(); // ICCIDの取得 String iccid = tm.getSimSerialNumber(); // 電話番号の取得 String line1Number = tm.getLine1Number(); // 通話相手の電話番号の取得 PhoneStateListener psl= new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { String incomingNumber = number; } }; tm.listen(psl, PhoneStateListener.LISTEN_CALL_STATE);
Android ID(OS初回起動時に生成する16桁の乱数=端末ID)
パーミッション
不要
コード
// Android IDの取得 String udid = Settings.Secure.getString(this.getContentResolver(), Settings.System.ANDROID_ID);
Macアドレス
パーミッション
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
コード
WifiManager wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE); // Macアドレスの取得 String mac = wifi.getConnectionInfo().getMacAddress();
基地局・wifiを使った位置情報
パーミッション
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
コード
public class MainActivity extends Activity implements LocationListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); } @Override public void onLocationChanged(Location location) { // 緯度の取得 double lat = location.getLatitude()); Log.i("LATITUDE", String.valueOf(lat)); // 経度の取得 double lng = location.getLongitude()); Log.i("LONGITUDE", String.valueOf(lng)); } ... 省略 ... }
GPSを使った位置情報
パーミッション
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
コード
public class MainActivity extends Activity implements LocationListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } @Override public void onLocationChanged(Location location) { // 緯度の取得 double lat = location.getLatitude()); Log.i("LATITUDE", String.valueOf(lat)); // 経度の取得 double lng = location.getLongitude()); Log.i("LONGITUDE", String.valueOf(lng)); } ... 省略 ... }
最後に取得された位置情報
パーミッション
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
コード
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); // 最後に取得された基地局・wifiによる位置情報 Location wifi = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // 最後に取得されたGPSによる位置情報 Location gps = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
通話履歴, アドレス帳(氏名、電話番号、メールアドレス、住所など)
パーミッション
<uses-permission android:name="android.permission.READ_CONTACTS" />
データアクセスのために利用されるURI
- 通話履歴: CallLog.Calls.CONTENT_URI
- 電話帳: ContactsContract.Contacts.CONTENT_URI
- 電話帳: ContactsContract.RawContacts.CONTENT_URI
- 電話帳: ContactsContract.RawContactsEntity.CONTENT_URI
- 電話帳: ContactsContract.Data.CONTENT_URI
- 電話帳: ContactsContract.Groups.CONTENT_URI
- 電話帳: ContactsContract.SyncState.CONTENT_URI
- 電話帳(住所): ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI
- 電話帳(メール): ContactsContract.CommonDataKinds.Email.CONTENT_URI
実行中のアプリ名
パーミッション
<uses-permission android:name="android.permission.GET_TASKS" />
コード
ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE); PackageManager pm = getPackageManager(); List<ActivityManager.RunningAppProcessInfo> pl = am.getRunningAppProcesses(); for(ActivityManager.RunningAppProcessInfo app : pl) { try { ApplicationInfo ai = pm.getApplicationInfo(app.processName, 0); String label = ai.loadLabel(pm); } catch (NameNotFoundException e) { e.printStackTrace(); } }
LogCat情報
パーミッション
<uses-permission android:name="android.permission.READ_LOGS" />
コード
try { Process process = Runtime.getRuntime().exec("logcat -d"); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); StringBuilder log = new StringBuilder(); String line = bufferedReader.readLine(); while ((line != null) { log.append(line); line = bufferedReader.readLine(); } } catch (IOException e) { e.printStackTrace(); }
Googleアカウント(Gmailアドレスなど)
パーミッション
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
コード
AccountManager manager = AccountManager.get(context); Account[] accountArray = manager.getAccounts();
Googleアカウントの認証結果(AuthToken)
パーミッション
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
コード
// AccountManager#getAuthToken()を使用する AccountManager manager = AccountManager.get(this); manager.getAuthToken(new Account("user@gmail.com", "com.google"), "mail", null, this, new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> future) { Bundle bundle = null; try { bundle = future.getResult(); String accountName = bundle.getString(AccountManager.KEY_ACCOUNT_NAME); String accountType = bundle.getString(AccountManager.KEY_ACCOUNT_TYPE); String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); } catch (OperationCanceledException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (AuthenticatorException e) { e.printStackTrace(); } } }, null);
SMSメール(Cメール)
パーミッション
<uses-permission android:name="android.permission.READ_SMS"/>
コード
ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(Uri.parse("content://sms/"), null, null, null, null); while (cursor.moveToNext()) { // SMSに1つ1つアクセス ... 省略 ... }
参考文献
- スマートフォンからの利用者情報の送信 ~情報収集の実態調査~:http://www.soumu.go.jp/main_content/000143966.pdf
- プログラム備忘録 Android の固有識別 ID 取得方法
- Androidのコンテントプロバイダで使えるURI一覧(1) | mucchinのAndroid戦記
- モバイル開発系(K)-Android開発 Tips 実行中のアプリケーションの一覧を取得する [ActivityManager, ActivityManager.RunningAppProcessInfo, PackageManager, ApplicationInfo]
- バグ報告システムでLogCatを送信する - Hacking My Way 〜 itogのhack日記
- Android - AccountManagerを利用する - Qiita
- Android KITKAT: デフォルトSMSアプリを作る - ブライテクノBlog