読者です 読者をやめる 読者になる 読者になる

Log.i53

Themidaのアンパックを目指すブログ改め使い物になるえんじにゃを目指すブログ

Androidにおける利用者情報アクセスに関わるパーミッションおよびAPI

Android メモ

研究に必要なので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つアクセス
    ... 省略 ...
}