مطلبی که این جلسه قصد آموزش آن را دارم کار با سیستم مدیریت حساب داخلی اندروید می باشد. می خواهیم در یک پروژه عملی یک حساب کاربری دلخواه بسازیم و بعد از ثبت نام اولیه , تایید از سرور، برنامه با استفاده از حساب کاربری داخلی ایجاد شده بطور خودکار لاگین کند. با توجه به اینکه منابع زیادی در این رابطه حتی به انگلیسی موجود نمی باشد، امیدوارم این مطلب برایتان مفید واقع شود. در واقع مشکل از جایی شروع شد که خودم به دنبال پیداکردن جوابی برای آن بودم نهایتاً تجربه شخصی خودم را برایتان به اشتراک می گذارم. البته در آموزش امروز با اصول اولیه حساب کاربری آشنا خواهیم شد و اصل مطلب برای آموزش بعدیست!
This class provides access to a centralized registry of the user’s online accounts. The user enters credentials (username and password) once per account, granting applications access to online resources with “one-click” approval.
طبق تعریف رسمی اندروید: AccountManager کلاسی است که ثبت نام های آنلاین کاربر را متمرکز کرده و با توجه به اطلاعاتی که از کاربر نگهداری می کند( از قبیل نام کاربری و کلمه عبور)، ارتباط با آن (کاربر ثبت شده) و استفاده از منابع آن را توسط برنامه ها به آسانی فراهم می کند.
برای کار با AccountManager اندروید نیاز به سه آیتم اصلی داریم که هرکدام را ملاحظه خواهید کرد.
- سرویس ویژه مدیریت حساب
- فایل xml حاوی اطلاعات مربوط به حساب کاربری
- یک نمونه از کلاس AbstractَAccountAuthenticator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class MyAthenticator extends AbstractAccountAuthenticator { public MyAthenticator(Context context) { super(context); } @Override public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { return null; } @Override public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { Log.i("MAHDI","on add account"); return null; } @Override public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException { return null; } @Override public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { return null; } @Override public String getAuthTokenLabel(String authTokenType) { return null; } @Override public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { return null; } @Override public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException { return null; } } |
در این کلاس مشتق شده متدها بطور خودکار تولید می شوند و توضیح اینکه کار اصلی آن چه است برای آموزش بعدی و فقط این را بدانید که اجباری است. من فقط در متد addAccount یک لاگ گذاشتم تا ببینید چه موقع فراخوانی می شود و بدانید اتفاقات این کلاس ارتباط مستقیمی به حساب کاربری دارد. مثلا هرجایی از Account-Manager استفاده کنیم و توسط آن اکانتی را اضافه کنید، متد addAccount در این کلاس فراخوانی می شود. ارتباط این کلاس با Account-manager توسط سرویسی است در پایین می بینید.
سرویس را بصورت زیر بسازید:
1 2 3 4 5 6 7 8 9 |
public class myService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { MyAthenticator authenticator = new MyAthenticator(getBaseContext()); return authenticator.getIBinder(); } } |
حال فایل xml در پوشه xml پروژه بسازید. من اسم این را account_data.xml می گذارم. همانطور که مشاهده می کنید نام برنامه، نوع دلخواه حساب کاربری و آیکون حساب کاربری تعریف می شود. (این آیکون همان آیکونی هست که وقتی از تنظیمات وارد حساب کاربری گوشی می شوید، انواع حساب های کاربری موجود را با آیکن آنها را می بینید!)
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="ir.mahditajik.testAppAccountType" android:icon="@mipmap/ic_launcher" android:smallIcon="@mipmap/ic_launcher" android:label="@string/app_name"/> |
سپس لازم است تا سرویس تولید شده را در فایل Manifest تعریف کرده و فایل account_data.xml را ضمیمه کنیم:
1 2 3 4 5 6 7 8 |
<service android:name=".MyService" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator"/> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/account_data"/> </service> |
حال تنها کاری که باید انجام دهیم استفاده از دستور accountmanageraddAccountExplicitly در هر جای دلخواه است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); if (fab != null) fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AccountManager accountManager = AccountManager.get(MainActivity.this); //this is Activity Account account = new Account("MyAccount", "com.mahdi"); boolean success = accountManager.addAccountExplicitly(account, "password", null); accountManager.setPassword(account, "mahditajik"); if (success) { Log.d("mahdi", "Account created"); } else { Log.d("mahdi", "Account creation failed. Look at previous logs to investigate"); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } |
خیلی خوب! شما موفق شدید با اجرای برنامه و لمس fab button حساب کاربری جدیدی از نوع “com.mahdi” ایجاد کنید که در آن نام کاربری و کلمه عبور قرار داده شده است. می توانید به تنظیمات گوشی رفته و حساب کاربری تولید شده را مشاهده کنید. امیدوارم آموزش براتون مفید بوده باشدو در آموزش بعدی نحوه استفاده از این نام کاربری و کلمه عبور برای لاگین خودکار و همچنین اتفاقات و متد های MyAutenticator را بطور مفصل مورد برسی قرار خواهیم داد. درصورتی که نکته نظر یا سوالی داشتید کامنت کنید.
سلام میشه ادامه آموزشتون رو بزارید خیلی نیاز دارم ممنون میشم
با تشکر
سلام.ممنون از مطالب مفیدتون
کاربرد این مبحث برام واضح نبود ،منتظر بقیه آموزش هستم
مرسی
سلام. خوشحالم که براتون مفید بوده. همانطور که در مقاله اشاره کرده ام، کاربرد این کلاس وقتی هست که بخواهیم در پروژه Accounting داشته باشیم و کاربر بتواند با یک یوز و پسی وارد برنامه شود. با استفاده از AccountManager می توانیم دسترسی موازی به یوزر های محتلف جهت اپ داشته باشیم. همانطور که شما می توانید با یوزر گوگل موجود در گوشیتان در برنامه های گوناگون به راحتی ثبتنام کنید. چشم، حتماً در اولین فرصت بخش تکمیلی را می نویسم.
چقدر جالب.آموزش رو بیشتر کنید تو سایتتون.ممنون
سلام. با تشکر از شما دوست عزیز، بسیار خوشحالم که مفید واقع شده. چشم حتماً.