সিকিউরিটি এক্সেপশন: কলার ইউএড XXXX প্রমাণীকরণকারীর uID থেকে পৃথক


84

নমুনা সিঙ্ক অ্যাডাপ্টার অ্যাপ্লিকেশনটি প্রয়োগ করার চেষ্টা করার সময় আমি উপরের ব্যতিক্রমটি পেয়েছি। আমি এই সমস্যাটি সম্পর্কিত অসংখ্য পোস্ট দেখেছি তবে সন্তোষজনক প্রতিক্রিয়া নেই।

সুতরাং অন্য কেউ যদি একই সমস্যায় পড়ে তবে আমি আমার সমাধানটি এখানে জানাব


ধন্যবাদ আমি এই সমস্যায় পড়েছি এবং আপনার পোস্টের জন্য ধন্যবাদ আরও দ্রুত সমাধান সন্ধান করতে পেরেছি।
দামিয়ান

4
দুর্ভাগ্যক্রমে, এর মধ্যে পোস্ট করা লিঙ্কটি ভেঙে গেছে। কারও কি বিকল্প আছে?
jhsin18

উত্তর:


54

এই জাতীয় সমস্যাগুলি ডিবাগ করার জন্য আরও কিছু দরকারী টিপস।

প্রথমে কিছু ট্যাগের জন্য ভার্বোজ লগিং সক্ষম করুন:

$ adb shell setprop log.tag.AccountManagerService VERBOSE
$ adb shell setprop log.tag.Accounts VERBOSE
$ adb shell setprop log.tag.Account VERBOSE
$ adb shell setprop log.tag.PackageManager VERBOSE

আপনি এই মত লগিং দেখতে পাবেন:

V/AccountManagerService: initiating bind to authenticator type com.example.account
V/Accounts: there is no service connection for com.example.account
V/Accounts: there is no authenticator for com.example.account, bailing out
D/AccountManagerService: bind attempt failed for Session: expectLaunch true, connected false, stats (0/0/0), lifetime 0.002, addAccount, accountType com.example.account, requiredFeatures null

যার অর্থ এই অ্যাকাউন্টের ধরণের জন্য কোনও প্রমাণীকরণকারী নেই। কোন প্রমাণীকরণকারী নিবন্ধিত রয়েছে তা দেখতে প্যাকেজ ইনস্টল করার সময় লগটি দেখুন:

D/PackageManager: encountered new type: ServiceInfo: AuthenticatorDescription {type=com.example.account}, ComponentInfo{com.example/com.example.android.AuthenticatorService}, uid 10028
D/PackageManager: notifyListener: AuthenticatorDescription {type=com.example.account} is added

আমার সমস্যা ছিল যে প্রমাণীকরণকারী এক্সএমএল বর্ণনাকারী একটি স্ট্রিং রিসোর্সে উল্লেখ করেছেন যা ইনস্টলেশনের সময় সঠিকভাবে সমাধান হয়নি:

android:accountType="@string/account_type"

লগগুলি দেখিয়েছে

encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...

এটি একটি সাধারণ স্ট্রিং (সংস্থান নয়) দিয়ে প্রতিস্থাপন করা সমস্যার সমাধান করে। এটি অ্যান্ড্রয়েড ২.১ নির্দিষ্ট বলে মনে হচ্ছে।

android:accountType="com.example.account"

এটি আমাকে সমস্যাটি ছিন্ন করতে সহায়তা করেছে।
স্কাইজেক

44

প্রথমে, এই পোস্টে বর্ণিত শর্তটি পরীক্ষা করুন :

[...] আপনি যদি AccountManagerServiceফর্মটির কোনও ত্রুটি দেখতে পান তবে caller uid XXXX is different than the authenticator's uidএটি কিছুটা বিভ্রান্তিকর হতে পারে। এই বার্তায় থাকা 'প্রমাণীকরণকারী' আপনার প্রমাণীকরণকারী শ্রেণি নয়, এটি অ্যাকাউন্টের ধরণের জন্য নিবন্ধিত প্রমাণীকরণকারী হিসাবে অ্যান্ড্রয়েড বোঝে। চেপের মধ্যে যা ঘটে তা AccountManagerServiceদেখে মনে হচ্ছে:

 private void checkCallingUidAgainstAuthenticator(Account account) {
     final int uid = Binder.getCallingUid();
     if (account == null || !hasAuthenticatorUid(account.type, uid)) {
         String msg = "caller uid " + uid + " is different than the authenticator's uid";
         Log.w(TAG, msg);
         throw new SecurityException(msg);
     }
     if (Log.isLoggable(TAG, Log.VERBOSE)) {
         Log.v(TAG, "caller uid " + uid + " is the same as the authenticator's uid");
     }
 }

নোট যে hasAuthenticatorUid()গ্রহণ করে account.type। এইখানেই আমি ভুল করলাম। আমি Accountধ্রুবক দ্বারা নির্দিষ্ট একটি টাইপ দিয়ে আমার তৈরি করছিলাম :

 class LoginTask {
     Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE);
     ...
 }

 class AuthenticatorService extends Service {
     public static final String ACCOUNT_TYPE = "com.joelapenna.foursquared";
     ...
 }

তবে এই ধ্রুবকটি আমার প্রমাণীকরণকারীর জন্য এক্সএমএল সংজ্ঞাটির সাথে মেলে না:

 <account-authenticator xmlns:android="/web/20150729061818/http://schemas.android.com/apk/res/android"
        android:accountType="com.joelapenna.foursquared.account" ... />

দ্বিতীয়ত, আপনি যদি আমার মতো হয়ে থাকেন এবং পরীক্ষার জন্য যদি আপনার বিদ্যমান অ্যাপ্লিকেশনটিতে নমুনাটি এম্বেড করতে চান তবে নিশ্চিত হন যে আপনি এই Constantsক্লাসটি ব্যবহার করেছেন যা এই উদাহরণের অংশ এবং android.provider.SyncStateContractপ্যাকেজের অধীনে নয় । কারণ উভয় শ্রেণিতে একই বৈশিষ্ট্যটির নাম ACCOUNT_TYPEব্যবহার করা হয় যা Accountঅবজেক্ট তৈরি করার সময় ব্যবহৃত হয় ।


ধন্যবাদ! আপনার প্রথম চেকটি সমস্যার সমাধান করেছে। এবং অনুমান করুন, একটি নতুন প্রকল্পে আমি প্রমাণীকরণকারী এক্সএমএল ফাইল সম্পর্কে সব ভুলে গিয়েছিলাম!
জর্জ প্লিগোরোপল্লো

7
আমি এখনও এই সমস্যাটি দেখছি, তবে কেবলমাত্র আমার কিছু ব্যবহারকারীর জন্য। আমি ডাবল পরীক্ষা করে দেখেছি যে অ্যান্ড্রয়েড: অ্যাকাউন্টে টাইপ করা হয়েছে প্রামাণিক। এক্সএমএল ফাইলে আমার জেনেরিক অ্যাকাউন্টসেস সার্ভিসের ধ্রুবকের সাথে মেলে। আমি আরও জানি যে এই ব্যতিক্রমটি আমার বেশিরভাগ অ্যাপ্লিকেশন ব্যবহারকারীদের জন্য ঘটে না, তবে আমার ক্র্যাশ লগগুলিতে এখনই এবং পরে আমি মুষ্টিমেয় ব্যবহারকারীর জন্য ক্র্যাশটি দেখতে পাচ্ছি। কোন ধারণা? প্রমাণীকরণ.এক্সএমএল ফাইলটি কোনও কারণে সংশোধন করা যেতে পারে?
লাইটস্পিড

4
@clu আপনি কি কখনও নিজের সমস্যার সমাধান করতে পেরেছিলেন? আমি একটি অভিন্ন দৃশ্যের মুখোমুখি। এই ত্রুটিটি কেবলমাত্র আমার ব্যবহারকারীর ক্ষুদ্র সংখ্যালঘুদের জন্যই ছড়িয়ে পড়ে: বেশিরভাগই এইচটিসি ওয়ান এক্স, এইচটিসি ওয়ান এসভি এবং এইচটিসি ডিজায়ার 500 এর পাশাপাশি অন্যান্য অনেক ডিভাইসকে ছড়িয়ে দিতে পারে।
চ্যান্দি

4
@ চ্যান্সসি একই কেবল এইচটিসি ডিভাইসগুলিতেই এই সমস্যাটি রয়েছে বলে মনে হচ্ছে। এটি প্রতিটি অন্যান্য ডিভাইসের জন্য দুর্দান্ত কাজ করে।
কিরণ কুমার

@ ক্লু আমিও একই সমস্যার মুখোমুখি আছি। আপনি কি এটি সমাধান করতে সক্ষম হয়েছেন বা এর মূল কারণটি খুঁজে পেতে পারেন?
wasaig

25

আমার ক্ষেত্রে সমস্যা খুব ছিল কেবল accountType একটি মেলেনি ঘোষণা res/xml/authenticator.xmlযেমন android:accountType="com.foo"কিন্তু ভুল রেফারেন্সড "foo.com"অ্যাকাউন্ট তৈরি:

Account newAccount = new Account("dummyaccount", "foo.com");

দোহ!


4
হাই, আমার ক্ষেত্রে এক্সএমএল এবং নতুন অ্যাকাউন্ট অ্যাকাউন্টে অ্যাকাউন্ট টাইপ দুটি একই are তবুও এটি কলার uid দেখাচ্ছে XXXX প্রমাণীকরণকারীর আইড ত্রুটির চেয়ে আলাদা। কেন?
বিজয় ভানখেদে

10

কাস্টম অ্যাকাউন্ট বাস্তবায়নের কয়েকটি অংশ রয়েছে ...

আপনার ক্রিয়াকলাপে অ্যাকাউন্টম্যানেজারের অনুরোধ জানাতে, এর আগে এমন কিছু আপনি ইতিমধ্যে প্রয়োগ করেছেন ...

Account account = new Account(username, ACCESS_TYPE);
AccountManager am = AccountManager.get(this);
Bundle userdata = new Bundle();
userdata.putString("SERVER", "extra");

if (am.addAccountExplicitly(account, password, userdata)) {
    Bundle result = new Bundle();
    result.putString(AccountManager.KEY_ACCOUNT_NAME, username);
    result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE);
    setAccountAuthenticatorResult(result);
}

রেজ / এক্সএমএল / প্রমাণীকরণকারী। এক্সএমএলে আপনাকে আপনার অ্যাকাউন্টআউটিক্যান্সেটর ডেটা (আপনার প্রমাণীকরণকারী ইউআইডি জন্য দায়ী) সংজ্ঞায়িত করতে হবে। এই এক্সএমএলে আপনার সংজ্ঞায়িত অ্যাকাউন্ট টাইপের মতোই স্ট্রিংটি ACCESS_TYPE হতে হবে!

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="de.buecherkiste"
    android:icon="@drawable/buecher"
    android:label="@string/app_name"
    android:smallIcon="@drawable/buecher" >
</account-authenticator>

শেষ পর্যন্ত আপনাকে আপনার পরিষেবাটি আপনার ম্যানিফেস্ট হিসাবে সংজ্ঞায়িত করতে হবে। আপনার অ্যাকাউন্টগুলি পরিচালনা করার জন্য দয়া করে প্রাসঙ্গিক অনুমতিগুলি ভুলে যাবেন না (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)

<service android:name=".AuthenticationService">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>

TYPO জন্য দেখুন! প্রমাণীকরণশক্তি পরিষেবা। প্লাস এটির আসলে নাম = "। প্রমাণীকরণের পরিষেবা" স্পষ্টতই, (একটি বিন্দু সহ) এবং এটি আমার ক্ষেত্রে এটি লাল রঙে দেখায়, তবে এটি যাইহোক কাজ করে।
ফ্লোরিয়ানবি

5

আমার ত্রুটিটি অ্যাকাউন্টম্যানেজার গেট অ্যাকাউন্টস () পদ্ধতিটি কেবলমাত্র আমার অ্যাপ্লিকেশন প্রসঙ্গে জড়িত অ্যাকাউন্টগুলি ফিরিয়ে নিয়েছিল তা ধরে নিয়েছিল। আমি থেকে পরিবর্তন

AccountManager accountManager = AccountManager.get(context);
Account[] accounts = accountManager.getAccounts();

প্রতি

AccountManager accountManager = AccountManager.get(context);
Account[] accounts = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);

4

আপনি যদি আপনার ম্যানিফেস্টে আপনার অভিপ্রায়-ফিল্টারগুলিতে ভুল মান রাখেন তবে একই ত্রুটি উপস্থিত হবে। আমি সিঙ্ক-অ্যাডাপ্টারগুলিতে অ্যান্ড্রয়েড-ডেভ টিউটোরিয়াল দিয়ে গিয়েছিলাম এবং সিঙ্কাডাপ্টার / অ্যাকাউন্টআউটিক্যান্টের জন্য "ইন্টেন্ট-ফিল্টার / অ্যাকশন অ্যান্ড্রয়েড: নাম" পাশাপাশি "মেটা-ডেটা / অ্যান্ড্রয়েড: নাম" এর জন্য একটি বোগাস মান সেট করে শেষ করেছি। এই ভুলটির ফলে একই ত্রুটিগুলি লগগুলিতে প্রদর্শিত হয়েছিল।

রেকর্ডের জন্য, সঠিক মানগুলি হ'ল: roid android.content.SyncAdapter, android.accounts.AccountAuthenticator}


2

আপনার পরিষেবা এক্সএমএল সঠিক অবস্থানের দিকে ইঙ্গিত করছে তা নিশ্চিত করুন।

উদাহরণস্বরূপ যদি আপনি মডিউল নাম হয়

com.example.module.auth

আপনি পরিষেবা অ্যান্ড্রয়েড: নাম হওয়া উচিত

<service android:name=".module.auth.name-of-authenticator-service-class"...

AndriodManifest.xML এ


2

প্রথমে, জান বার্কেলের দুর্দান্ত ডিবাগিং পরামর্শটি আবার দেখুন।

শেষ অবধি, অন্য একটি জিনিস যাচাই করে দেখুন তা হল আপনার সামগ্রী সরবরাহকারী এবং প্রমাণীকরণ এবং সিঙ্ক পরিষেবাদি applicationট্যাগটির শিশু হিসাবে ঘোষণা করা হয়েছে ।

    <application
        ...>
        <activity
            ...(Activity)...
        </activity>
        <provider
            ...(CP service declaration)/>

        <service
            ...(Authentication service declaration)...
        </service>

        <service
            ...(Sync service declaration)... 
        </service>
    </application>

<আবেদন> এর সন্তানের! এটা আমার জন্য, ধন্যবাদ! এবং এটি হল <পরিষেবা অ্যান্ড্রয়েড: নাম = "
.থেন্টিকেশন সার্ভিস

2

আমার জন্য এটি খুব নির্বোধ ভুল ছিল এবং এটি খুঁজে পাওয়া খুব কঠিন ছিল।

প্রমাণীকরণকারী.এক্সএমএল-এ লিখেছি

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.myapp"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/app_name"
/>

পরিবর্তে

<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.myapp"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/app_name"
/>

যা এই ত্রুটি ঘটাচ্ছে। আশা করি এটি কাউকে সাহায্য করবে!


2

আমার ক্ষেত্রে এটি ছিল মেনিফেস্ট ফাইলে অনুমতি ছিল

<uses-permission android:name="ANDROID.PERMISSION.GET_ACCOUNTS"/>

এটি সমস্ত ক্যাপ ছিল, যখন আমি এটিকে পরিবর্তন করি

<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

সমস্যা চলে গেছে


1

এছাড়াও,

আপনি সরল-পুরাতন-স্ট্রিংয়ের মতো একাউন্টটাইপকে খুব বেশি ট্রিট করছেন কিনা তা পরীক্ষা করে দেখুন।

আমার বেশিরভাগ কোড com.mycompany.android এর অধীনে প্যাকেজড আছে

আমি সাফল্যের সঙ্গে নিম্নলিখিত AccountType ব্যবহার করা হয়েছে: com.mycompany.android.ACCOUNT

এখন আমার একাধিক অ্যাকাউন্ট ব্যবহার করার ইচ্ছা আছে এবং যখন আমি আমার অ্যাকাউন্টের শেষে ".সুবটাইপ" যুক্ত করার পদ্ধতির চেষ্টা করি তখন এটির সাথে ব্যর্থ হয়

কলার ইউড এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সটি সত্যায়কের ইউডের চেয়ে আলাদা

তবে, যদি আমি "_সুবটাইপ" (বিন্দুর পরিবর্তে আন্ডারস্কোর) ব্যবহার করি তবে এটি দুর্দান্ত কাজ করে।

আমার অনুমান যে হুডের নিচে কোথাও অ্যান্ড্রয়েড com.mycompany.android.ACCOUNT কে একটি আইনি প্যাকেজের নাম হিসাবে বিবেচনা করার চেষ্টা করছে, যা সম্ভবত এটি নয়।

সুতরাং, আবার:

খারাপ com.mycompany.android.ACCOUNT.subType

ভাল com.mycompany.android.ACCOUNT_subType


1

আপনি যদি এই ত্রুটিটি পেয়ে থাকেন এবং উপরের সমস্ত সমাধান আপনার পক্ষে কাজ করে না। এছাড়াও, আপনি ধরে নিলেন যে আপনি সমস্ত পদ্ধতি অনুসরণ করেছেন। এমন কোনও সম্ভাবনা থাকতে পারে যে প্রমাণীকরণ পরিষেবাটি অন্য কোনও বিকাশকারী দ্বারা বিকাশ করা হয়েছিল, যা আপনি অ্যাকাউন্টগুলিতে যোগ করতে চান।

আপনি যা চেষ্টা করতে পারেন তা হ'ল একটি রিলিজ কীস্টোরের মাধ্যমে আপনার অ্যাপ্লিকেশনটিতে স্বাক্ষর করার চেষ্টা করুন। এখন আপনি অ্যাপ্লিকেশন চালান। আমি মনে করি এটি আপনার পক্ষে কাজ করা উচিত।


1

এখানে আরও একটি সম্ভাব্য সমাধান রয়েছে।

আমার ব্যবহারকারী যখন তার অ্যাপ্লিকেশনটিতে তার অ্যান্ড্রয়েড গুগল অ্যাকাউন্ট হিসাবে একই ইমেল দিয়ে নিবন্ধিত হয়েছিল তখন আমার এই ত্রুটি হয়েছিল।

সুতরাং, যখন আমি accountManager.getAccounts()এই ইমেলটি অনুসন্ধান করার চেষ্টা করেছি এবং একই অ্যাকাউন্টে অন্য অ্যাকাউন্টের ধরণের সাথে একই ই-মেইল বুট দিয়েছিলাম। সুতরাং, এই (google.com) অ্যাকাউন্টটি ব্যবহার করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি।

সুতরাং, কোনও অ্যাকাউন্ট সন্ধানের সঠিক উপায় হ'ল:

public Account findAccount(String accountName) {
    for (Account account : accountManager.getAccounts())
        if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com"))
            return account;
    return null;
}

accountManager.getAccountsByType("myservice.com")পরিবর্তে আপনি কল করতে পারেন ।
নিকগ্রিম

0

এছাড়াও নিশ্চিত হয়ে নিন যে আপনার অ্যাকাউন্টআউটিক্যান্সেটর সার্ভিসে প্রভার অভিপ্রায় ফিল্টার রয়েছে;

অর্থাত্

<service android:name=".service.AccountAuthenticatorService">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data android:name="android.accounts.AccountAuthenticator"
                    android:resource="@xml/authenticator" />
 </service>

0

আপনি যদি স্যামসাং ডিভাইসে এই ব্যতিক্রমটি পান তবে নিশ্চিত হন যে আপনি নিরাপদ মোড ব্যবহার করছেন না ।


0

যদি একই অ্যাপসটি বিভিন্ন স্টোর থেকে থাকে, উদাহরণস্বরূপ অ্যামাজন অ্যাপ্লিকেশন স্টোর এবং গুগল প্লে স্টোর, তবে শেষ পর্যন্ত সুরক্ষার ব্যতিক্রম অ্যাপ্লিকেশনগুলির স্বাক্ষর হিসাবে নিক্ষেপ করা হবে। আপনি যদি একক উদ্দেশ্যে একই প্রমাণীকরণকারী ব্যবহার করার পরিকল্পনা করেছিলেন সাইন ইন করুন, অ্যাপ্লিকেশনটির কোনওটি ক্রাশ হবে। আমি একবার এই সমস্যার মুখোমুখি হয়েছিলাম। বিশেষত অ্যামাজন অ্যাপ স্টোরটি সুরক্ষার প্রয়োজনে নিজের অ্যাপ্লিকেশনগুলিতে স্বাক্ষর দিয়ে স্বাক্ষর করত।

দ্রষ্টব্য: এখানে কোনও টাইপ ত্রুটি বা অন্য উত্তর বর্ণিত উত্তর না থাকলে দয়া করে একক সাইন ইন করার ক্ষেত্রে অ্যাপসের স্বাক্ষর পরীক্ষা করে দেখুন।


0

এখনও যারা কাটিয়ে উঠেছে তাদের জন্য: https://stackoverflow.com/a/37102317/4171098

আমার ক্ষেত্রে আমি দুর্ঘটনাক্রমে <application>ট্যাগগুলির বাইরে ম্যানিফেস্টে প্রমাণীকরণকারী পরিষেবাটি সংজ্ঞায়িত করেছি । ঘোষণাকে ভিতরে নিয়ে <application>যাওয়া বিষয়টি স্থির করে। আশা করি কাউকে সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.