스마트폰앱

오늘:
2,084
어제:
2,822
전체:
2,720,173

고객센타 : 070-7752-2000
팩스 : 070-7752-2001
휴대폰 : 010-9513-0019
email : voipkorea@yahoo.co.kr

국민은행
(주)제이에스솔루션
047101-04-155519

Flag Counter
■ 무료 : 유선 집전화 휴대폰 ( 한국 미국 중국 카나다) ↔ (국내 해외 여행자 상사 주재원 유학생) / 가입무 무제한무료■

http://csbandroid.springnote.com/pages/7112493?print=1

 

  1. import fm.last.android.LastFm;
  2. import android.accounts.AbstractAccountAuthenticator;
  3. import android.accounts.Account;
  4. import android.accounts.AccountAuthenticatorResponse;
  5. import android.accounts.AccountManager;
  6. import android.accounts.NetworkErrorException;
  7. import android.app.Service;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.os.Bundle;
  11. import android.os.IBinder;
  12. import android.util.Log;
  13.  
  14. /**
  15.  * Authenticator service that returns a subclass of AbstractAccountAuthenticator in onBind()
  16.  */
  17. public class AccountAuthenticatorService extends Service {
  18.  private static final String TAG = "AccountAuthenticatorService";
  19.  private static AccountAuthenticatorImpl sAccountAuthenticator = null;
  20.  
  21.  public AccountAuthenticatorService() {
  22.   super();
  23.  }
  24.  
  25.  public IBinder onBind(Intent intent) {
  26.   IBinder ret = null;
  27.   if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT))
  28.    ret = getAuthenticator().getIBinder();
  29.   return ret;
  30.  }
  31.  
  32.  private AccountAuthenticatorImpl getAuthenticator() {
  33.   if (sAccountAuthenticator == null)
  34.    sAccountAuthenticator = new AccountAuthenticatorImpl(this);
  35.   return sAccountAuthenticator;
  36.  }
  37.  
  38.  private static class AccountAuthenticatorImpl extends AbstractAccountAuthenticator {
  39.   private Context mContext;
  40.  
  41.   public AccountAuthenticatorImpl(Context context) {
  42.    super(context);
  43.    mContext = context;
  44.   }
  45.  
  46.   /*
  47.    *  The user has requested to add a new account to the system.  We return an intent that will launch our login screen if the user has not logged in yet,
  48.    *  otherwise our activity will just pass the user's credentials on to the account manager.
  49.    */
  50.   @Override
  51.   public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options)
  52.     throws NetworkErrorException {
  53.    Bundle reply = new Bundle();
  54.  
  55.    Intent i = new Intent(mContext, LastFm.class);
  56.    i.setAction("fm.last.android.sync.LOGIN");
  57.    i.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
  58.    reply.putParcelable(AccountManager.KEY_INTENT, i);
  59.  
  60.    return reply;
  61.   }
  62.  
  63.   @Override
  64.   public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) {
  65.    return null;
  66.   }
  67.  
  68.   @Override
  69.   public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
  70.    return null;
  71.   }
  72.  
  73.   @Override
  74.   public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
  75.    return null;
  76.   }
  77.  
  78.   @Override
  79.   public String getAuthTokenLabel(String authTokenType) {
  80.    return null;
  81.   }
  82.  
  83.   @Override
  84.   public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
  85.    return null;
  86.   }
  87.  
  88.   @Override
  89.   public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) {
  90.    return null;
  91.   }
  92.  }
  93. }

  

요렇게 구현을 하시고 아래 AndroidManifest.xml 파일에 meta-data를 넣어 주어야 합니다. 

  1. Snippet from AndroidManifest.xml

    1. <service android:name="AccountAuthenticatorService"
    2.  android:exported="true" android:process=":auth">
    3.  <intent-filter>
    4.   <action android:name="android.accounts.AccountAuthenticator" />
    5.  </intent-filter>
    6.  <meta-data android:name="android.accounts.AccountAuthenticator"
    7.   android:resource="@xml/authenticator" />
    8. </service>

 

로그인 화면이 없다면 AccountAuthenticatorActivity 클래스가 있네요. 요 클래스는 authentication manger에게 우리의 응답을 전달해주는 기능이 있나보네요... 

사용자가 성공적으로 인증이 되면 사용자의 인증서를 위해 Account object 를 만듭니다. Account는 사용자 이름이나 이메일 주소와 같은 account name과 account type을 가지고 있습니다. 

 

  1.  

    Snippet from the Last.fm login activity

    1. Account account = new Account(username, getString(R.string.ACCOUNT_TYPE)));
    2. AccountManager am = AccountManager.get(this);
    3. boolean accountCreated = am.addAccountExplicitly(account, password, null);
    4.  
    5. Bundle extras = getIntent.getExtras();
    6. if (extras != null) {
    7.  if (accountCreated) {  //Pass the new account back to the account manager
    8.   AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
    9.   Bundle result = new Bundle();
    10.   result.putString(AccountManager.KEY_ACCOUNT_NAME, username);
    11.   result.putString(AccountManager.KEY_ACCOUNT_TYPE, getString(R.string.ACCOUNT_TYPE));
    12.   response.onResult(result);
    13.  }
    14.  finish();
    15. }

 

Sync provider

Account를 만드는 방법은 위에서 배웠고 동기화 하는 과정을 할 차례!

 

Contacts sync provider를 구현하기 위해 먼저 service, 몇개의 xml파일, 아래 permission을 AndroidManifest.xml, 파일에 추가해야겠네요.

 

  1.  

    1. <uses-permission android:name="android.permission.INTERNET" />
    2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    3. <uses-permission android:name="android.permission.READ_CONTACTS" />
    4. <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    5. <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    6. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    7. <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    8. <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    9. <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

 

The Service

Account Authenticator service 처럼 Contacts Sync Provider service는 onBind 메서드에서 AbstractThreadedSyncAdapter 하위 클래스를 반환한다. 

  1.  

    1.  
    2. ContactsSyncAdapterService.java
      public class ContactsSyncAdapterService extends Service {
    3.  private static final String TAG = "ContactsSyncAdapterService";
    4.  private static SyncAdapterImpl sSyncAdapter = null;
    5.  private static ContentResolver mContentResolver = null;
    6.  
    7.  public ContactsSyncAdapterService() {
    8.   super();
    9.  }
    10.  
    11.  private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
    12.   private Context mContext;
    13.  
    14.   public SyncAdapterImpl(Context context) {
    15.    super(context, true);
    16.    mContext = context;
    17.   }
    18.  
    19.   @Override
    20.   public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    21.    try {
    22.     ContactsSyncAdapterService.performSync(mContext, account, extras, authority, provider, syncResult);
    23.    } catch (OperationCanceledException e) {
    24.    }
    25.   }
    26.  }
    27.  
    28.  @Override
    29.  public IBinder onBind(Intent intent) {
    30.   IBinder ret = null;
    31.   ret = getSyncAdapter().getSyncAdapterBinder();
    32.   return ret;
    33.  }
    34.  
    35.  private SyncAdapterImpl getSyncAdapter() {
    36.   if (sSyncAdapter == null)
    37.    sSyncAdapter = new SyncAdapterImpl(this);
    38.   return sSyncAdapter;
    39.  }
    40.  
    41.  private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
    42.    throws OperationCanceledException {
    43.   mContentResolver = context.getContentResolver();
    44.   Log.i(TAG, "performSync: " + account.toString());
    45.   //This is where the magic will happen!
    46.  }
    47. }

 

AndroidManifest.xml 파일에 다음과 같이 서비스를 등록 해야겠네요..

  1.  

    1. <service android:name=".sync.ContactsSyncAdapterService"
    2.  android:exported="true" android:process=":contacts">
    3.  <intent-filter>
    4.   <action android:name="android.content.SyncAdapter" />
    5.  </intent-filter>
    6.  <meta-data android:name="android.content.SyncAdapter"
    7.   android:resource="@xml/sync_contacts" />
    8. </service>

 

최종적으로 안드로이드가 위에서 정의한 Account type을 Contacts에서 다룰수 있는 우리의 sync provider를 알수 있도록 해주는 xml파일이 필요하네요. 

  1.  

    sync_contacts.xml

    1. <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    2.     android:contentAuthority="com.android.contacts"
    3.     android:accountType="fm.last.android.account"/>

여기까지 아무 동작도 하지 않는 sync provider를 만든거라는군용... 이제 코드를 더 넣어봐야 하나봐요.. 

 

 

 

 

 

 

Social status updates

안드로이드는 소셜네트워크 상태를 업데이트 해주는 table을 가지고 있습니다. 이 레코드에 레코드를 넣으면 타임 스탬프를 비교해서 새로

입력되는 레코드가 최신이면 최신것으로 대체 됩니다. 그렇지 않을 경우 입력된 레코드는 버려지고 기존의 레코드가 유지 되겠죠? (당연한 소릴... )

status update record는 Data record 와 연관이 되어 있습니다.  status records는 status text , resource가 위치하는 패키지 이름, Icon 리소스, label 리소스를 포함합니다. 다음 코드는 stuats update를 삽입하는 기능을 나타내네요. 

  1.  

    updateContactStatus method

    1. private static void updateContactStatus(ArrayList<ContentProviderOperation> operationList, long rawContactId, Track track) {
    2.  Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
    3.  Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
    4.  Cursor c = mContentResolver.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null);
    5.  try {
    6.   while (c.moveToNext()) {
    7.    if (!c.isNull(1)) {
    8.     String mimeType = c.getString(2);
    9.     String status = "";
    10.     if (track.getNowPlaying() != null && track.getNowPlaying().equals("true"))
    11.      status = "Listening to " + track.getName() + " by " + track.getArtist();
    12.     else
    13.      status = "Listened to " + track.getName() + " by " + track.getArtist();
    14.  
    15.     if (mimeType.equals("vnd.android.cursor.item/vnd.fm.last.android.profile")) {
    16.      ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.StatusUpdates.CONTENT_URI);
    17.      builder.withValue(ContactsContract.StatusUpdates.DATA_ID, c.getLong(1));
    18.      builder.withValue(ContactsContract.StatusUpdates.STATUS, status);
    19.      builder.withValue(ContactsContract.StatusUpdates.STATUS_RES_PACKAGE, "fm.last.android");
    20.      builder.withValue(ContactsContract.StatusUpdates.STATUS_LABEL, R.string.app_name);
    21.      builder.withValue(ContactsContract.StatusUpdates.STATUS_ICON, R.drawable.icon);
    22.      if (track.getDate() != null) {
    23.       long date = Long.parseLong(track.getDate()) * 1000;
    24.       builder.withValue(ContactsContract.StatusUpdates.STATUS_TIMESTAMP, date);
    25.      }
    26.      operationList.add(builder.build());
    27.  
    28.      builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
    29.      builder.withSelection(BaseColumns._ID + " = '" + c.getLong(1) + "'", null);
    30.      builder.withValue(ContactsContract.Data.DATA3, status);
    31.      operationList.add(builder.build());
    32.     }
    33.    }
    34.   }
    35.  } finally {
    36.   c.close();
    37.  }
    38. }

위 코드를 수행하면 전화번호부 사용자 계정에 삽입된 연락처 정보가 나오는 군요... 

제목_없음.JPG

 

Putting It All Together
  1.  

    performSync method

    1. private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
    2.   throws OperationCanceledException {
    3.  HashMap<String, Long> localContacts = new HashMap<String, Long>();
    4.  mContentResolver = context.getContentResolver();
    5.  Log.i(TAG, "performSync: " + account.toString());
    6.  
    7.  // Load the local Last.fm contacts
    8.  Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name).appendQueryParameter(
    9.    RawContacts.ACCOUNT_TYPE, account.type).build();
    10.  Cursor c1 = mContentResolver.query(rawContactUri, new String[] { BaseColumns._ID, RawContacts.SYNC1 }, null, null, null);
    11.  while (c1.moveToNext()) {
    12.   localContacts.put(c1.getString(1), c1.getLong(0));
    13.  }
    14.  
    15.  ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
    16.  LastFmServer server = AndroidLastFmServerFactory.getServer();
    17.  try {
    18.   Friends friends = server.getFriends(account.name, "", "50");
    19.   for (User user : friends.getFriends()) {
    20.    if (!localContacts.containsKey(user.getName())) {
    21.     if (user.getRealName().length() > 0)
    22.      addContact(account, user.getRealName(), user.getName());
    23.     else
    24.      addContact(account, user.getName(), user.getName());
    25.    } else {
    26.     Track[] tracks = server.getUserRecentTracks(user.getName(), "true", 1);
    27.     if (tracks.length > 0) {
    28.      updateContactStatus(operationList, localContacts.get(user.getName()), tracks[0]);
    29.     }
    30.    }
    31.   }
    32.   if(operationList.size() > 0)
    33.    mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);
    34.  } catch (Exception e1) {
    35.   // TODO Auto-generated catch block
    36.   e1.printStackTrace();
    37.  }
    38. }

 

 

 

조회 수 :
38735
등록일 :
2012.09.30
19:57:00 (*.160.42.233)
엮인글 :
http://webs.co.kr/index.php?document_srl=11867&act=trackback&key=4d4
게시글 주소 :
http://webs.co.kr/index.php?document_srl=11867
List of Articles
번호 제목 글쓴이 날짜 조회 수
64 Sqlite detail easy tutorial. admin 2017-09-09 190
63 Change package name Linphone Android admin 2017-08-25 301
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 304
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 297
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 287
59 sipdroid source code admin 2017-08-08 363
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 5649
57 the sipdroid Research Miscellaneous admin 2015-03-26 2763
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 4030
55 Softphones admin 2014-09-20 4467
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 4879
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 4828
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 5637
51 speex support in android admin 2014-03-19 5864
50 voxmobile Source and how to build admin 2014-02-18 6236
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 6672
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 18380
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 6629
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 32731
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 7696
44 Android DialogFragment Tutorial admin 2014-02-09 6923
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 9366
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 8284
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 7613
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 13965
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 6944
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 9306
37 How to create a custom title bar admin 2013-07-15 9550
36 Rotary Dialer clip art admin 2013-04-20 17195
35 Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 10205
34 java network programming source code, learning socket programming admin 2012-12-04 10330
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 12105
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 16430
31 통신사별 와이파이 비밀번호 admin 2012-10-31 14407
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 10688
29 Android User Session Management using Shared Preferences admin 2012-10-16 32031
28 Unicode Tables v4 admin 2012-10-16 22976
27 HTML Codes admin 2012-10-16 9648
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 11823
25 ASCII Table and Description admin 2012-10-16 11131
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 22131
23 How to read contacts on Android 2.0 admin 2012-10-14 13170
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 15089
21 Android Detect Internet Connection Status admin 2012-10-12 20645
20 JAVA + SSL (server and client examples) admin 2012-10-07 22184
19 Querying The Android Contact Database admin 2012-09-30 10537
18 Manage Contacts android admin 2012-09-30 12497
17 Android Contacts API 2 example admin 2012-09-30 13596
» Android 2.0 주소록 동기화 기능 admin 2012-09-30 38735
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 14574
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 11228
13 [안드로이드/개발] Intent admin 2012-09-23 17572
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 28220
11 google voice source code admin 2012-09-22 10525
10 [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 20390
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 11611
8 Android SQlite 사용 admin 2012-09-04 11138
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 41835
6 전화관련 안드로이드함수 admin 2012-08-18 15147
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 15698
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 11055
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 13016
2 App Store - ILD Dialer admin 2012-06-17 9599
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 9955