ডিভাইস ট্রাস্ট সিগন্যাল প্রাপ্তির উদ্দেশ্যে AMAPI SDK ব্যবহারের জন্য এই নথিটি আপনার প্রাথমিক নির্দেশিকা হওয়া উচিত।
AMAPI SDK ADP (Android Device Policy) অ্যাপ থেকে ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করতে আপনার অ্যাপ্লিকেশানকে (যাকে আমরা কখনও কখনও একটি "সঙ্গী" অ্যাপ হিসাবে উল্লেখ করতে পারি) সক্ষম করে৷ আপনার অ্যাপ্লিকেশানটি তখন ডিভাইসের বিশ্বাসের অবস্থা গণনা করতে এবং বেছে নেওয়া ব্যবসায়িক যুক্তি প্রয়োগ করতে এই সংকেতগুলি ব্যবহার করতে পারে৷
পূর্বশর্ত
- অননুমোদিত ব্যবহার রোধ করতে ডিভাইস ট্রাস্ট সিগন্যালে অ্যাক্সেস সীমাবদ্ধ। কীভাবে আবেদন করতে হবে সে সম্পর্কে তথ্যের জন্য, ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস পৃষ্ঠায় যান।
- অ্যান্ড্রয়েড এন্টারপ্রাইজ আপনার ক্লায়েন্ট অ্যাপ্লিকেশানে API-এর প্লে ইন্টিগ্রিটি স্যুটকে একীভূত করার এবং ডিভাইস ট্রাস্ট সিগন্যাল পড়ার এবং তার উপর নির্ভর করার আগে ফলাফল উল্লেখ করার পরামর্শ দেয়। যে ডিভাইসগুলি প্লে ইন্টিগ্রিটি এপিআই চেক করতে ব্যর্থ হয় সেগুলিকে বিশ্বাস করা উচিত নয় বা বিশ্বাসের ভঙ্গি নির্ধারণ করতে ব্যবহৃত ডিভাইস থেকে প্রাপ্ত কোনও সংকেতও বিশ্বাস করা উচিত নয়৷ আরো বিস্তারিত জানার জন্য আপনি Play Integrity এর ডকুমেন্টেশন দেখতে পারেন।
আপনার অ্যাপ্লিকেশনে AMAPI SDK-এর সাথে একীভূত করুন
ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করতে আপনার অ্যাপ্লিকেশনটিকে AMAPI SDK এর সাথে একীভূত করতে হবে৷ আপনি AMAPI SDK ইন্টিগ্রেশন গাইডে এই লাইব্রেরি সম্পর্কে আরও তথ্য এবং আপনার অ্যাপ্লিকেশনে এটি কীভাবে যুক্ত করবেন তা জানতে পারেন।
প্রয়োজনীয় অনুমতি যোগ করুন
অ্যান্ড্রয়েড এন্টারপ্রাইজ এপিআই থেকে ডিভাইস ট্রাস্ট থেকে প্রত্যাবর্তিত কয়েকটি সংকেতের জন্য অ্যাপটি একই অনুমতি ঘোষণা করে যা প্রথম স্থানে এই তথ্য অ্যাক্সেস করার জন্য প্রয়োজন হবে, বিশেষ করে:
সংকেত | প্রয়োজনীয় অনুমতি |
---|---|
নেটওয়ার্ক অবস্থা | ACCESS_NETWORK_STATE |
স্ক্রীন লক জটিলতা | REQUEST_PASSWORD_COMPLEXITY |
যদি এই অনুমতিগুলি অ্যাপের AndroidManifest.xml
এ অন্তর্ভুক্ত না থাকে, তাহলে Android Enterprise API-এর ডিভাইস ট্রাস্ট সম্পর্কিত সংকেতের মেটাডেটাতে PERMISSION_ISSUE
ফেরত দেবে:
internalDeviceSettings=DeviceSettings{
screenLockComplexity=COMPLEXITY_UNSPECIFIED,
internalScreenLockComplexityMetadata=Metadata{
dataIssues=[
DataIssue{
issueType=PERMISSION_ISSUE,
issueLevel=WARNING,
issueDetails=IssueDetailsCase{none}
}
]
},
অতিরিক্ত বিবরণের জন্য উপলব্ধ ডিভাইস বিশ্বাস সংকেত তালিকা দেখুন.
ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করার পদক্ষেপ
যে অ্যাপ্লিকেশনগুলি ডিভাইস ট্রাস্ট সিগন্যালগুলি অ্যাক্সেস করতে চায় তাদের ক্লায়েন্ট এনভায়রনমেন্ট আপ টু ডেট কিনা তা যাচাই করতে এবং প্রয়োজনে এটি আপডেট করতে হবে৷
ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করার পদক্ষেপগুলি হল:
ক্লায়েন্ট পরিবেশ যাচাই করুন
নিম্নলিখিত কোড উদাহরণ ADP অ্যাপের বর্তমান অবস্থা পড়তে getEnvironment
কিভাবে ব্যবহার করতে হয় তা দেখায়। পরিবেশ প্রস্তুত এবং আপ টু ডেট থাকলে আপনার অ্যাপ্লিকেশন ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করতে একটি deviceClient
তৈরি করতে পারে (দেখুন ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করুন )।
কোটলিন
import com.google.android.managementapi.common.model.Role import com.google.android.managementapi.device.DeviceClient import com.google.android.managementapi.device.DeviceClientFactory import com.google.android.managementapi.device.model.GetDeviceRequest import com.google.android.managementapi.environment.EnvironmentClient import com.google.android.managementapi.environment.EnvironmentClientFactory import com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.INSTALLED import com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.NOT_INSTALLED import com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.READY import com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.Version.UP_TO_DATE import com.google.android.managementapi.environment.model.GetEnvironmentRequest import com.google.android.managementapi.environment.model.PrepareEnvironmentRequest try { val context = applicationContext val roles = listOf(Role.builder().setRoleType(Role.RoleType.IDENTITY_PROVIDER).build()) val request = GetEnvironmentRequest.builder().setRoles(roles).build() val environmentClient = EnvironmentClientFactory.create(context) val environmentResponse = environmentClient.getEnvironment(request) if (environmentResponse.hasAndroidDevicePolicyEnvironment()) { val adpEnvironment = environmentResponse.androidDevicePolicyEnvironment if (adpEnvironment.state == READY && adpEnvironment.version == UP_TO_DATE) { // AMAPI Environment State OK, Version OK. Requesting Device signals.. checkDevice(deviceClient = DeviceClientFactory.create(context)) } else if (adpEnvironment.state == INSTALLED) { // prepareEnvironment should be called, calling // prepareEnvironment won't show the UI prepareEnvironment(context, environmentClient) } else if (adpEnvironment.state == NOT_INSTALLED) { // prepareEnvironment should be called, calling // prepareEnvironment will show the UI prepareEnvironment(context, environmentClient) } } } catch (e: Exception) { Log.e(TAG, "Exception", e) }
জাভা
import static com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.INSTALLED; import static com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.NOT_INSTALLED; import static com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.State.READY; import static com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment.Version.UP_TO_DATE; import com.google.android.managementapi.common.model.Role; import com.google.android.managementapi.device.DeviceClient; import com.google.android.managementapi.device.DeviceClientFactory; import com.google.android.managementapi.device.model.Device; import com.google.android.managementapi.device.model.GetDeviceRequest; import com.google.android.managementapi.environment.EnvironmentClient; import com.google.android.managementapi.environment.EnvironmentClientFactory; import com.google.android.managementapi.environment.model.Environment; import com.google.android.managementapi.environment.model.Environment.AndroidDevicePolicyEnvironment; import com.google.android.managementapi.environment.model.GetEnvironmentRequest; import com.google.android.managementapi.environment.model.PrepareEnvironmentRequest; import com.google.android.managementapi.environment.model.PrepareEnvironmentResponse; try { Context context = getApplicationContext(); ImmutableListroles = new ImmutableList.Builder () .add(Role.builder() .setRoleType(Role.RoleType.IDENTITY_PROVIDER) .build()) .build(); EnvironmentClient environmentClient = EnvironmentClientFactory.create(context); GetEnvironmentRequest request = GetEnvironmentRequest.builder() .setRoles(roles) .build(); ListenableFuture getEnvironmentFuture = environmentClient.getEnvironmentAsync(request); Futures.addCallback(getEnvironmentFuture, new FutureCallback<>() { @Override public void onSuccess(Environment environment) { AndroidDevicePolicyEnvironment adpEnvironment = environment.getAndroidDevicePolicyEnvironment(); AndroidDevicePolicyEnvironment.State state = adpEnvironment.getState(); AndroidDevicePolicyEnvironment.Version version = adpEnvironment.getVersion(); if (state == READY && version == UP_TO_DATE) { // AMAPI Environment State OK, Version OK. Requesting Device signals.. DeviceClient deviceClient = DeviceClientFactory.create(context); checkDevice(deviceClient); } else if (state == INSTALLED) { // prepareEnvironment should be called, calling // prepareEnvironment won't show the UI prepareEnvironment(context, environmentClient); } else if (state == NOT_INSTALLED) { // prepareEnvironment should be called, calling // prepareEnvironment will show the UI prepareEnvironment(context, environmentClient); } } @Override public void onFailure(Throwable t) { Log.d(TAG, t.toString()); } }, MoreExecutors.directExecutor()); } catch (Exception e) { Log.d(TAG, e.toString()); }
যদি ADP অ্যাপ ইনস্টল করা থাকে কিন্তু আপ-টু-ডেট না থাকে, তাহলে ব্যবহারকারীর হস্তক্ষেপ ছাড়াই নীরবে ADP অ্যাপ আপডেট করার জন্য আপনার অ্যাপ্লিকেশানের prepareEnvironment
কল করা উচিত।
যদি ADP অ্যাপ ইনস্টল করা না থাকে, তাহলে আপনার অ্যাপ্লিকেশনটি ব্যবহারকারীকে ADP অ্যাপ ইনস্টল করার জন্য প্রম্পট করতে prepareEnvironment
কল করতে পারে। ক্লায়েন্ট পরিবেশ প্রস্তুত দেখুন।
ক্লায়েন্ট পরিবেশ প্রস্তুত করুন
যদি ADP অ্যাপটি ইতিমধ্যেই ইনস্টল করা থাকে, তাহলে API ব্যবহারকারীর হস্তক্ষেপ ছাড়াই নীরবে এটি আপডেট করবে।
যদি ADP অ্যাপ ইনস্টল করা না থাকে, তাহলে API ব্যবহারকারীকে ADP অ্যাপ ইনস্টল করার জন্য অনুরোধ করবে।
ব্যবহারকারীর পছন্দ নিরীক্ষণ করতে একটি কলব্যাক নিবন্ধন করা সম্ভব। অতিরিক্ত বিবরণের জন্য ADP অ্যাপ ইনস্টলেশনের সময় ব্যবহারকারীর ইন্টারঅ্যাকশন ট্র্যাক করুন দেখুন।
আমরা সুপারিশ করছি যে prepareEnvironment
কলটি একটি ফোরগ্রাউন্ড প্রক্রিয়া থেকে করা হয়, অনবোর্ডিং UX ফ্লো চলাকালীন Android ডিভাইস নীতি মোডাল ডায়ালগ ইনস্টল করে ব্যবহারকারীকে অবাক করা এড়াতে। যদি ফোরগ্রাউন্ড প্রক্রিয়া থেকে কল করা সম্ভব না হয়, কারণ এটি একটি ওয়েব ফ্লো এবং অ্যান্ড্রয়েড কম্পোনেন্টের কোনো UI নেই, তাহলে পটভূমি থেকে কল করার অনুমতি দেওয়া হয় যে এটি অনবোর্ডিং UX প্রবাহের সময় ঘটে।
কোটলিন
try { val myNotificationReceiverService = ComponentName( context, MyNotificationReceiverService::class.java ) val roles = listOf(Role.builder().setRoleType(Role.RoleType.IDENTITY_PROVIDER).build()) val request = PrepareEnvironmentRequest.builder().setRoles(roles).build() val response = environmentClient.prepareEnvironment(request, myNotificationReceiverService) val environment = response.environment val adpEnvironment = environment.androidDevicePolicyEnvironment val state = adpEnvironment.state val version = adpEnvironment.version if (state == READY && version == UP_TO_DATE) { // Environment is prepared, access device posture signals using // DeviceClient. checkDevice(deviceClient = DeviceClientFactory.create(context)) } else { // The prepareEnvironment call failed to prepare Log.w( TAG, "AMAPI environment was not ready: " + state + " - " + version ) } } catch (e: java.lang.Exception) { Log.d(TAG, e.toString()) }
জাভা
try { ComponentName myNotificationReceiverService = new ComponentName( context, MyNotificationReceiverService.class ); ImmutableListroles = new ImmutableList.Builder () .add(Role.builder() .setRoleType(Role.RoleType.IDENTITY_PROVIDER) .build()) .build(); PrepareEnvironmentRequest request = PrepareEnvironmentRequest.builder() .setRoles(roles) .build(); ListenableFuture environmentFuture = environmentClient.prepareEnvironmentAsync( request, myNotificationReceiverService ); Futures.addCallback(environmentFuture, new FutureCallback<>() { @Override public void onSuccess(PrepareEnvironmentResponse response) { Environment environment = response.getEnvironment(); AndroidDevicePolicyEnvironment adpEnvironment = environment.getAndroidDevicePolicyEnvironment(); AndroidDevicePolicyEnvironment.State state = adpEnvironment.getState(); AndroidDevicePolicyEnvironment.Version version = adpEnvironment.getVersion(); if (state == READY && version == UP_TO_DATE) { // AMAPI Environment State OK, Version OK. Requesting Device signals.. DeviceClient deviceClient = DeviceClientFactory.create(context); checkDevice(deviceClient); } else { // The prepareEnvironment call failed to prepare Log.w( TAG, "AMAPI environment was not ready: " + adpEnvironment.getState() + " - " + adpEnvironment.getVersion() ); } } @Override public void onFailure(@NonNull Throwable t) { // Handle the error Log.d(TAG, "AMAPI response did not contain an ADP environment"); } }, MoreExecutors.directExecutor()); } catch (Exception e) { Log.d(TAG, e.toString()); }
ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করুন
আপনি আগ্রহী ডিভাইস ট্রাস্ট সিগন্যাল অ্যাক্সেস করতে, আপনি Device
অবজেক্টের অনুরোধ করতে পূর্ববর্তী ধাপে দেখা deviceClient
উদাহরণ ব্যবহার করতে পারেন।
কোটলিন
try { kotlin.runCatching { deviceClient.getDeviceAwait(GetDeviceRequest.getDefaultInstance()) }.onFailure { t -> Log.d(TAG, t.toString()) }.onSuccess { device -> // Access device posture signals available in device val deviceString = device.toString() Log.d(TAG, deviceString) } } catch (e: java.lang.Exception) { Log.d(TAG, e.toString()) }
জাভা
try { ListenableFuturedeviceFuture = deviceClient.getDevice(GetDeviceRequest.getDefaultInstance()); Futures.addCallback(deviceFuture, new FutureCallback () { @Override public void onSuccess(Device device) { // Access device posture signals available in device String deviceString = device.toString(); Log.d(TAG, deviceString); } @Override public void onFailure(Throwable t) { Log.d(TAG, Log.d(TAG, t.toString()); } }, MoreExecutors.directExecutor()); } catch (Exception e) { Log.d(TAG, e.toString()); }
ADP অ্যাপ ইনস্টলেশনের সময় ব্যবহারকারীর মিথস্ক্রিয়া ট্র্যাক করুন
prepareEnvironment
সময় ডিভাইসটির যদি ADP অ্যাপ ইনস্টল করার প্রয়োজন হয় তবে আপনার অ্যাপ্লিকেশনটি getPrepareEnvironmentListener
ওভাররাইডিং বিজ্ঞপ্তিগুলি পাওয়ার জন্য একটি NotificationReceiverService
প্রয়োগ করে ব্যবহারকারীর ইন্টারঅ্যাকশন ট্র্যাক করতে পারে:
কোটলিন
import android.util.Log import com.google.android.managementapi.environment.EnvironmentListener import com.google.android.managementapi.environment.model.EnvironmentEvent.EventCase.Kind.ANDROID_DEVICE_POLICY_INSTALL_CONSENT_ACCEPTED import com.google.android.managementapi.environment.model.EnvironmentEvent import com.google.android.managementapi.notification.NotificationReceiverService class MyNotificationReceiverService : NotificationReceiverService() { override fun getPrepareEnvironmentListener(): EnvironmentListener { return MyEnvironmentListener() } } class MyEnvironmentListener : EnvironmentListener { override fun onEnvironmentEvent( event: EnvironmentEvent ) { if (event.event.kind == ANDROID_DEVICE_POLICY_INSTALL_CONSENT_ACCEPTED) { Log.d(TAG, "User provided install consent") } else { Log.d(TAG, "User rejected install consent") } } companion object { private val TAG: String = MyEnvironmentListener::class.java.simpleName } }
জাভা
import static com.google.android.managementapi.environment.model.EnvironmentEvent.EventCase.Kind.ANDROID_DEVICE_POLICY_INSTALL_CONSENT_ACCEPTED; import android.util.Log; import androidx.annotation.NonNull; import com.google.android.managementapi.environment.EnvironmentListener; import com.google.android.managementapi.environment.model.EnvironmentEvent; import com.google.android.managementapi.notification.NotificationReceiverService; class MyNotificationReceiverService extends NotificationReceiverService { @NonNull @Override protected EnvironmentListener getPrepareEnvironmentListener() { return new MyEnvironmentListener(); } } class MyEnvironmentListener implements EnvironmentListener { final private String TAG = MyEnvironmentListener.class.getSimpleName(); @Override public void onEnvironmentEvent(EnvironmentEvent event) { if (event.getEvent().getKind() == ANDROID_DEVICE_POLICY_INSTALL_CONSENT_ACCEPTED) { Log.d(TAG, "User provided install consent"); } else { Log.d(TAG, "User rejected install consent"); } } }
পরিচিত সমস্যা
এই মুহূর্তে কোন পরিচিত সমস্যা নেই.