আপনি কীভাবে অ্যান্ড্রয়েডের প্রাথমিক ইমেল ঠিকানা (বা ই-মেইল ঠিকানাগুলির একটি তালিকা) পাবেন?
এটি আমার বোধগম্য যে ওএস ২.০+ তে একাধিক ই-মেইল অ্যাড্রেসের সমর্থন রয়েছে তবে ২.০ এর নীচে আপনার প্রতি ডিভাইসটিতে কেবল একটি ইমেল ঠিকানা থাকতে পারে।
আপনি কীভাবে অ্যান্ড্রয়েডের প্রাথমিক ইমেল ঠিকানা (বা ই-মেইল ঠিকানাগুলির একটি তালিকা) পাবেন?
এটি আমার বোধগম্য যে ওএস ২.০+ তে একাধিক ই-মেইল অ্যাড্রেসের সমর্থন রয়েছে তবে ২.০ এর নীচে আপনার প্রতি ডিভাইসটিতে কেবল একটি ইমেল ঠিকানা থাকতে পারে।
উত্তর:
এটি করার বিভিন্ন উপায় রয়েছে যা নীচে দেখানো হয়েছে।
বন্ধুত্বপূর্ণ সতর্কতা হিসাবে, অ্যাকাউন্ট, প্রোফাইল এবং যোগাযোগের ডেটা নিয়ে ডিল করার সময় সাবধান এবং ব্যবহারকারীর সামনে থাকুন। আপনি যদি কোনও ব্যবহারকারীর ইমেল ঠিকানা বা অন্যান্য ব্যক্তিগত তথ্য অপব্যবহার করেন তবে খারাপ জিনিসগুলি ঘটতে পারে।
আপনি ডিভাইসে সমস্ত অ্যাকাউন্টের নামের তালিকা ব্যবহার করতে AccountManager.getAccounts
বা AccountManager.getAccountsByType
পেতে পারেন । ভাগ্যক্রমে, নির্দিষ্ট অ্যাকাউন্টের ধরণের (সহ com.google
) অ্যাকাউন্টের নামগুলি ইমেল ঠিকানা। নীচে স্নিপেট উদাহরণ।
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(context).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
String possibleEmail = account.name;
...
}
}
নোট করুন যে এর GET_ACCOUNTS
অনুমতির প্রয়োজন :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
ব্যবহারের বিষয়ে আরও তথ্য এসডিকে AccountManager
থাকা যোগাযোগ ম্যানেজারের নমুনা কোডে পাওয়া যাবে ।
অ্যান্ড্রয়েড 4.0.০ (আইসক্রিম স্যান্ডউইচ) হিসাবে, আপনি ব্যবহারকারীর ইমেল ঠিকানাগুলি তাদের প্রোফাইল অ্যাক্সেসের মাধ্যমে পেতে পারেন। ব্যবহারকারীর প্রোফাইলে অ্যাক্সেস করা কিছুটা ভারী ওজনের কারণ এতে দুটি অনুমতির দরকার হয় (নীচে সেইটিতে আরও), তবে ইমেল ঠিকানাগুলি মোটামুটি সংবেদনশীল টুকরাযুক্ত ডেটা, তাই এটি প্রবেশের মূল্য।
নীচে একটি পূর্ণ উদাহরণ যা CursorLoader
ইমেল ঠিকানাগুলি সহ প্রোফাইল ডেটা সারিগুলি পুনরুদ্ধার করতে ব্যবহার করে ।
public class ExampleActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
return new CursorLoader(this,
// Retrieve data rows for the device user's 'profile' contact.
Uri.withAppendedPath(
ContactsContract.Profile.CONTENT_URI,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
ProfileQuery.PROJECTION,
// Select only email addresses.
ContactsContract.Contacts.Data.MIMETYPE + " = ?",
new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE},
// Show primary email addresses first. Note that there won't be
// a primary email address if the user hasn't specified one.
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
List<String> emails = new ArrayList<String>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
emails.add(cursor.getString(ProfileQuery.ADDRESS));
// Potentially filter on ProfileQuery.IS_PRIMARY
cursor.moveToNext();
}
...
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
private interface ProfileQuery {
String[] PROJECTION = {
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
int ADDRESS = 0;
int IS_PRIMARY = 1;
}
}
এর জন্য অনুমতি READ_PROFILE
এবং READ_CONTACTS
অনুমতি উভয়ই দরকার :
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
cursor.isAfterLast()
সর্বদা সত্য ফিরে। কোন ধারণা?
এটি অন্যের জন্য দরকারী হতে পারে:
কোনও বৈশ্বিক অনুমতি ছাড়াই ব্যবহারকারীর ইমেল ঠিকানা পেতে অ্যাকাউন্টপিকার ব্যবহার করে এবং ব্যবহারকারীকে সচেতন হতে ও প্রক্রিয়াটি অনুমোদন করতে বা বাতিল করতে দেয়।
আমি আইসিএসে প্রবর্তিত অ্যান্ড্রয়েডের অ্যাকাউন্টপিকার ব্যবহার করব ।
Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);
এবং তারপরে ফলাফলটির জন্য অপেক্ষা করুন:
protected void onActivityResult(final int requestCode, final int resultCode,
final Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
}
}
public String getUsername() {
AccountManager manager = AccountManager.get(this);
Account[] accounts = manager.getAccountsByType("com.google");
List<String> possibleEmails = new LinkedList<String>();
for (Account account : accounts) {
// TODO: Check possibleEmail against an email regex or treat
// account.name as an email address only for certain account.type values.
possibleEmails.add(account.name);
}
if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
String email = possibleEmails.get(0);
String[] parts = email.split("@");
if (parts.length > 1)
return parts[0];
}
return null;
}
android.permission.GET_ACCOUNTS
, যা 'বিপজ্জনক' অনুমতি হিসাবে সংজ্ঞায়িত করা হয় (রানটাইম অনুরোধের প্রয়োজন): বিকাশকারী.অ্যান্ড্রয়েড.
একটি অ্যান্ড্রয়েড এপিআই রয়েছে যা ব্যবহারকারীর অনুমতি ছাড়াই তাদের ইমেল ঠিকানা নির্বাচন করতে দেয়। এক নজরে দেখুন: https://developers.google.com / ::
HintRequest hintRequest = new HintRequest.Builder()
.setHintPickerConfig(new CredentialPickerConfig.Builder()
.setShowCancelButton(true)
.build())
.setEmailAddressIdentifierSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE)
.build();
PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Could not start hint picker Intent", e);
}
এটি একটি চয়নকারী দেখায় যেখানে ব্যবহারকারী কোনও ইমেল ঠিকানা নির্বাচন করতে পারে। ফলাফল বিতরণ করা হবেonActivityResult()
দুঃখজনকভাবে গৃহীত উত্তর কাজ করছে না।
আমি দেরি করেছি, তবে সামগ্রীটির ইউরির সরবরাহকারীর দ্বারা পরিবর্তন না করা হলে অভ্যন্তরীণ অ্যান্ড্রয়েড ইমেল অ্যাপ্লিকেশনটির সমাধান এখানে রয়েছে:
Uri EMAIL_ACCOUNTS_DATABASE_CONTENT_URI =
Uri.parse("content://com.android.email.provider/account");
public ArrayList<String> GET_EMAIL_ADDRESSES ()
{
ArrayList<String> names = new ArrayList<String>();
ContentResolver cr = m_context.getContentResolver();
Cursor cursor = cr.query(EMAIL_ACCOUNTS_DATABASE_CONTENT_URI ,null,
null, null, null);
if (cursor == null) {
Log.e("TEST", "Cannot access email accounts database");
return null;
}
if (cursor.getCount() <= 0) {
Log.e("TEST", "No accounts");
return null;
}
while (cursor.moveToNext()) {
names.add(cursor.getString(cursor.getColumnIndex("emailAddress")));
Log.i("TEST", cursor.getString(cursor.getColumnIndex("emailAddress")));
}
return names;
}
এটি অ্যান্ড্রয়েডে করা বেশ জটিল জিনিস এবং আমি এখনও এটি করি নি। তবে এই লিঙ্কগুলি আপনাকে সহায়তা করতে পারে:
এই পদ্ধতিটি ব্যবহার করুন:
public String getUserEmail() {
AccountManager manager = AccountManager.get(App.getInstance());
Account[] accounts = manager.getAccountsByType("com.google");
List<String> possibleEmails = new LinkedList<>();
for (Account account : accounts) {
possibleEmails.add(account.name);
}
if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
return possibleEmails.get(0);
}
return "";
}
নোট করুন যে এর GET_ACCOUNTS
অনুমতির প্রয়োজন :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
তারপর:
editTextEmailAddress.setText(getUserEmail());
অ্যান্ড্রয়েড 8 এর পরে নতুন বিধিনিষেধ আরোপ করা হওয়ায় প্রস্তাবিত উত্তরগুলি আর কাজ করবে না।
এখানে আরও তথ্য: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
অ্যান্ড্রয়েড GET_ACCOUNTS
সম্প্রতি লকড হয়েছে তাই কিছু উত্তর আমার পক্ষে কাজ করে না। আপনার ব্যবহারকারীদের একটি অনুমতি ডায়ালগ সহ্য করতে হবে সেই সতর্কতার সাথে আমি Android 7.0 এ কাজ করেছি।
Andro আইডি
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
MainActivity.java
package com.example.patrick.app2;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.accounts.AccountManager;
import android.accounts.Account;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.*;
public class MainActivity extends AppCompatActivity {
final static int requestcode = 4; //arbitrary constant less than 2^16
private static String getEmailId(Context context) {
AccountManager accountManager = AccountManager.get(context);
Account[] accounts = accountManager.getAccountsByType("com.google");
Account account;
if (accounts.length > 0) {
account = accounts[0];
} else {
return "length is zero";
}
return account.name;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case requestcode:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
String emailAddr = getEmailId(getApplicationContext());
ShowMessage(emailAddr);
} else {
ShowMessage("Permission Denied");
}
}
}
public void ShowMessage(String email)
{
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage(email);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getApplicationContext();
if ( ContextCompat.checkSelfPermission( context, android.Manifest.permission.GET_ACCOUNTS )
!= PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions( this, new String[]
{ android.Manifest.permission.GET_ACCOUNTS },requestcode );
}
else
{
String possibleEmail = getEmailId(getApplicationContext());
ShowMessage(possibleEmail);
}
}
}
মার্শমিলে অপারেটিং সিস্টেমে কাজ করা
btn_click=(Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
int permissionCheck = ContextCompat.checkSelfPermission(PermissionActivity.this,
android.Manifest.permission.CAMERA);
if (permissionCheck == PackageManager.PERMISSION_GRANTED)
{
//showing dialog to select image
String possibleEmail=null;
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
possibleEmail = account.name;
Log.e("keshav","possibleEmail"+possibleEmail);
}
}
Log.e("keshav","possibleEmail gjhh->"+possibleEmail);
Log.e("permission", "granted Marshmallow O/S");
} else { ActivityCompat.requestPermissions(PermissionActivity.this,
new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.READ_PHONE_STATE,
Manifest.permission.GET_ACCOUNTS,
android.Manifest.permission.CAMERA}, 1);
}
} else {
// Lower then Marshmallow
String possibleEmail=null;
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
possibleEmail = account.name;
Log.e("keshav","possibleEmail"+possibleEmail);
}
Log.e("keshav","possibleEmail gjhh->"+possibleEmail);
}
}
});
এই একক লাইনটি ম্যানিফেস্টে যুক্ত করুন ( অনুমতি হিসাবে )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
তারপরে আপনার ক্রিয়াকলাপে এই কোডটি আটকে দিন
private ArrayList<String> getPrimaryMailId() {
ArrayList<String> accountsList = new ArrayList<String>();
try {
Account[] accounts = AccountManager.get(this).getAccountsByType("com.google");
for (Account account : accounts) {
accountsList.add(account.name);
Log.e("GetPrimaryMailId ", account.name);
}
} catch (Exception e) {
Log.e("GetPrimaryMailId", " Exception : " + e);
}
return accountsList;
}