한국어

스마트폰앱

온누리070 플레이스토어 다운로드
    acrobits softphone
     온누리 070 카카오 프러스 친구추가온누리 070 카카오 프러스 친구추가친추
     카카오톡 채팅 상담 카카오톡 채팅 상담카톡
    
     라인상담
     라인으로 공유

     페북공유
    
     PAYPAL
     
     PRICE
     

pixel.gif

    before pay call 0088 from app


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. }

 

 

 

조회 수 :
51813
등록일 :
2012.09.30
19:57:00 (*.160.42.233)
엮인글 :
http://webs.co.kr/index.php?document_srl=11867&act=trackback&key=d71
게시글 주소 :
http://webs.co.kr/index.php?document_srl=11867
List of Articles
번호 제목 글쓴이 날짜 조회 수
65 Package org.linphone.core Description admin 2017-10-22 2599
64 Sqlite detail easy tutorial. admin 2017-09-09 2840
63 Change package name Linphone Android admin 2017-08-25 3011
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 3251
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 2955
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 3106
59 sipdroid source code admin 2017-08-08 3062
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 14964
57 the sipdroid Research Miscellaneous admin 2015-03-26 5787
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 9130
55 Softphones admin 2014-09-20 7542
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 8406
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 8115
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 8747
51 speex support in android admin 2014-03-19 8759
50 voxmobile Source and how to build admin 2014-02-18 9743
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 10003
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 43698
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 9711
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 100285
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 10925
44 Android DialogFragment Tutorial admin 2014-02-09 10546
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 13380
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 12393
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 10783
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 17956
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 10246
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 13050
37 How to create a custom title bar admin 2013-07-15 13155
36 Rotary Dialer clip art admin 2013-04-20 20764
35 Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 14519
34 java network programming source code, learning socket programming admin 2012-12-04 13732
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 15449
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 21466
31 통신사별 와이파이 비밀번호 admin 2012-10-31 23919
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 14040
29 Android User Session Management using Shared Preferences admin 2012-10-16 41770
28 Unicode Tables v4 admin 2012-10-16 35016
27 HTML Codes admin 2012-10-16 13019
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 15200
25 ASCII Table and Description admin 2012-10-16 14599
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 31018
23 How to read contacts on Android 2.0 admin 2012-10-14 17143
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 19260
21 Android Detect Internet Connection Status admin 2012-10-12 25015
20 JAVA + SSL (server and client examples) admin 2012-10-07 25904
19 Querying The Android Contact Database admin 2012-09-30 14293
18 Manage Contacts android admin 2012-09-30 16506
17 Android Contacts API 2 example admin 2012-09-30 17503
» Android 2.0 주소록 동기화 기능 admin 2012-09-30 51813
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 18451
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 15089
13 [안드로이드/개발] Intent admin 2012-09-23 26633
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 37054
11 google voice source code admin 2012-09-22 14167
10 [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 29903
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 15471
8 Android SQlite 사용 admin 2012-09-04 16894
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 53114
6 전화관련 안드로이드함수 admin 2012-08-18 18766
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 18782
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 14480
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 16237
2 App Store - ILD Dialer admin 2012-06-17 12651
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 13125