অ্যান্ড্রয়েড প্ল্যাটফর্ম ডিভাইসগুলিকে কাজের প্রোফাইল (কখনও কখনও পরিচালিত প্রোফাইল হিসাবে উল্লেখ করা হয়) থাকতে দেয়। একটি কাজের প্রোফাইল একজন আইটি অ্যাডমিন দ্বারা নিয়ন্ত্রিত হয় এবং এতে উপলব্ধ কার্যকারিতা ব্যবহারকারীর প্রাথমিক প্রোফাইলের কার্যকারিতা থেকে আলাদাভাবে সেট করা হয়৷ এই পদ্ধতিটি সংস্থাগুলিকে সেই পরিবেশ নিয়ন্ত্রণ করতে দেয় যেখানে কোনও ব্যবহারকারীর ডিভাইসে কোম্পানি-নির্দিষ্ট অ্যাপ এবং ডেটা চলছে, যদিও ব্যবহারকারীদের তাদের ব্যক্তিগত অ্যাপ এবং প্রোফাইল ব্যবহার করতে দেয়।
এই পাঠটি আপনাকে দেখায় কিভাবে আপনার অ্যাপ্লিকেশন পরিবর্তন করতে হয় যাতে এটি একটি কাজের প্রোফাইল সহ একটি ডিভাইসে নির্ভরযোগ্যভাবে কাজ করে৷ আপনাকে সাধারণ অ্যাপ-ডেভেলপমেন্ট সেরা অনুশীলনগুলি ছাড়া আর কিছু করতে হবে না। যাইহোক, কাজের প্রোফাইল সহ ডিভাইসগুলিতে এই সেরা অনুশীলনগুলির মধ্যে কিছু বিশেষভাবে গুরুত্বপূর্ণ হয়ে ওঠে। এই দস্তাবেজটি আপনাকে যে বিষয়গুলি সম্পর্কে সচেতন হতে হবে তা হাইলাইট করে৷
ওভারভিউ
ব্যবহারকারীরা প্রায়ই একটি এন্টারপ্রাইজ সেটিংসে তাদের ব্যক্তিগত ডিভাইস ব্যবহার করতে চান। এই পরিস্থিতি সংস্থাগুলিকে দ্বিধাগ্রস্ত করতে পারে। ব্যবহারকারী যদি তাদের নিজস্ব ডিভাইস ব্যবহার করতে পারে, তাহলে সংস্থাকে চিন্তা করতে হবে যে গোপনীয় তথ্য (যেমন কর্মচারী ইমেল এবং পরিচিতি) এমন একটি ডিভাইসে রয়েছে যা সংস্থা নিয়ন্ত্রণ করে না।
এই পরিস্থিতি মোকাবেলার জন্য, Android 5.0 (API স্তর 21) সংস্থাগুলিকে কাজের প্রোফাইল সেট আপ করার অনুমতি দেয়৷ যদি একটি ডিভাইসে একটি কাজের প্রোফাইল থাকে, তবে প্রোফাইলের সেটিংস আইটি অ্যাডমিনের নিয়ন্ত্রণে থাকে৷ আইটি প্রশাসক সেই প্রোফাইলের জন্য কোন অ্যাপগুলি অনুমোদিত তা চয়ন করতে পারেন এবং প্রোফাইলে কোন ডিভাইস বৈশিষ্ট্যগুলি উপলব্ধ তা নিয়ন্ত্রণ করতে পারেন৷
যদি একটি ডিভাইসের একটি কাজের প্রোফাইল থাকে, তবে ডিভাইসে চলমান অ্যাপগুলির জন্য প্রভাব রয়েছে, অ্যাপটি যে প্রোফাইলের অধীনে চলছে তা নির্বিশেষে:
- ডিফল্টরূপে, বেশিরভাগ অভিপ্রায় এক প্রোফাইল থেকে অন্য প্রোফাইলে যায় না। প্রোফাইলে চলমান কোনও অ্যাপ যদি কোনও উদ্দেশ্যকে ফায়ার করে, তবে সেই প্রোফাইলে অভিপ্রায়ের জন্য কোনও হ্যান্ডলার নেই এবং প্রোফাইল সীমাবদ্ধতার কারণে অভিপ্রায়টিকে অন্য প্রোফাইলে যাওয়ার অনুমতি দেওয়া হয় না, অনুরোধ ব্যর্থ হয় এবং অ্যাপটি অপ্রত্যাশিতভাবে বন্ধ হয়ে যেতে পারে।
- প্রোফাইল আইটি প্রশাসক কাজের প্রোফাইলে কোন সিস্টেম অ্যাপগুলি উপলব্ধ তা সীমিত করতে পারেন৷ এই নিষেধাজ্ঞার ফলে কাজের প্রোফাইলে কিছু সাধারণ অভিপ্রায়ের জন্য কোনো হ্যান্ডলার নেই।
- যেহেতু ব্যক্তিগত এবং কাজের প্রোফাইলের আলাদা স্টোরেজ এলাকা রয়েছে, তাই একটি ফাইল ইউআরআই যা একটি প্রোফাইলে বৈধ তা অন্যটিতে বৈধ নয়। একটি প্রোফাইলে ফায়ার করা যেকোন উদ্দেশ্য অন্যটিতে (প্রোফাইল সেটিংসের উপর নির্ভর করে) পরিচালনা করা যেতে পারে, তাই ইন্টেন্টে ফাইল URI সংযুক্ত করা নিরাপদ নয়।
ব্যর্থ অভিপ্রায় রোধ করুন
একটি কাজের প্রোফাইল সহ একটি ডিভাইসে, উদ্দেশ্যগুলি এক প্রোফাইল থেকে অন্য প্রোফাইলে যেতে পারে কিনা তার উপর বিধিনিষেধ রয়েছে৷ বেশিরভাগ ক্ষেত্রে, যখন একটি উদ্দেশ্য বহিস্কার করা হয়, এটি একই প্রোফাইলে পরিচালনা করা হয় যেখানে এটি বহিস্কার করা হয়। যদি সেই প্রোফাইলে অভিপ্রায়ের জন্য কোনও হ্যান্ডলার না থাকে, তাহলে অভিপ্রায়টি পরিচালনা করা হয় না এবং যে অ্যাপটি এটিকে ফায়ার করেছে সেটি অপ্রত্যাশিতভাবে বন্ধ হয়ে যেতে পারে—এমনকি অন্য প্রোফাইলে অভিপ্রায়ের জন্য একজন হ্যান্ডলার থাকলেও৷
প্রোফাইল প্রশাসক এক প্রোফাইল থেকে অন্য প্রোফাইলে কোন উদ্দেশ্যগুলি অতিক্রম করার অনুমতি দেওয়া হয় তা চয়ন করতে পারেন৷ যেহেতু আইটি প্রশাসক এই সিদ্ধান্ত নেন, তাই কোন উদ্দেশ্যগুলিকে এই সীমানা অতিক্রম করার অনুমতি দেওয়া হয়েছে তা আগে থেকে জানার কোনও উপায় নেই৷ আইটি প্রশাসক এই নীতি সেট করে, এবং যে কোনো সময় এটি পরিবর্তন করতে স্বাধীন।
আপনার অ্যাপ একটি কার্যকলাপ শুরু করার আগে, আপনি একটি উপযুক্ত রেজোলিউশন আছে কিনা তা যাচাই করা উচিত। আপনি Intent.resolveActivity()
কল করে একটি গ্রহণযোগ্য রেজোলিউশন আছে কিনা তা যাচাই করতে পারেন। অভিপ্রায় সমাধান করার কোন উপায় না থাকলে, পদ্ধতিটি null
ফেরত দেয়। যদি পদ্ধতিটি নন-নাল রিটার্ন করে, তাহলে অভিপ্রায় সমাধান করার জন্য অন্তত একটি উপায় আছে এবং অভিপ্রায়টি বন্ধ করা নিরাপদ। এই ক্ষেত্রে, অভিপ্রায়টি সমাধানযোগ্য হতে পারে কারণ বর্তমান প্রোফাইলে একটি হ্যান্ডলার আছে, অথবা উদ্দেশ্যটিকে অন্য প্রোফাইলে একটি হ্যান্ডলারের কাছে যাওয়ার অনুমতি দেওয়া হয়েছে৷ (ইন্টেন্টগুলি সমাধান করার বিষয়ে আরও তথ্যের জন্য, সাধারণ অভিপ্রায়গুলি দেখুন।)
উদাহরণস্বরূপ, যদি আপনার অ্যাপের টাইমার সেট করার প্রয়োজন হয়, তাহলে ACTION_SET_TIMER
উদ্দেশ্যের জন্য একটি বৈধ হ্যান্ডলার আছে কিনা তা পরীক্ষা করতে হবে। যদি অ্যাপটি অভিপ্রায় সমাধান করতে না পারে, তাহলে এটি একটি উপযুক্ত ব্যবস্থা নেওয়া উচিত (যেমন একটি ত্রুটি বার্তা দেখানো)।
কোটলিন
fun startTimer(message: String, seconds: Int) { // Build the "set timer" intent val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } // Check if there's a handler for the intent if (timerIntent.resolveActivity(packageManager) == null) { // Can't resolve the intent! Fail this operation cleanly // (perhaps by showing an error message) } else { // Intent resolves, it's safe to fire it off startActivity(timerIntent) } }
জাভা
public void startTimer(String message, int seconds) { // Build the "set timer" intent Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); // Check if there's a handler for the intent if (timerIntent.resolveActivity(getPackageManager()) == null) { // Can't resolve the intent! Fail this operation cleanly // (perhaps by showing an error message) } else { // Intent resolves, it's safe to fire it off startActivity(timerIntent); } }
প্রোফাইল জুড়ে ফাইল শেয়ার করুন
কখনও কখনও একটি অ্যাপকে তার নিজস্ব ফাইলগুলিতে অ্যাক্সেস সহ অন্য অ্যাপগুলিকে প্রদান করতে হয়। উদাহরণস্বরূপ, একটি ইমেজ গ্যালারি অ্যাপ ইমেজ এডিটরদের সাথে তার ছবি শেয়ার করতে চাইতে পারে। দুটি উপায়ে আপনি সাধারণত একটি ফাইল শেয়ার করবেন: একটি ফাইল URI বা একটি সামগ্রী URI দিয়ে।
একটি ফাইল URI file:
উপসর্গ, ডিভাইসের স্টোরেজে ফাইলটির পরম পথ অনুসরণ করে। যাইহোক, যেহেতু কাজের প্রোফাইল এবং ব্যক্তিগত প্রোফাইল পৃথক স্টোরেজ এলাকা ব্যবহার করে, একটি ফাইল URI যা একটি প্রোফাইলে বৈধ তা অন্যটিতে বৈধ নয়। এই পরিস্থিতির মানে হল যে আপনি যদি একটি ফাইল URI একটি উদ্দেশ্যের সাথে সংযুক্ত করেন, এবং উদ্দেশ্যটি অন্য প্রোফাইলে পরিচালনা করা হয়, হ্যান্ডলার ফাইলটি অ্যাক্সেস করতে সক্ষম হবে না।
পরিবর্তে, আপনার ইউআরআই সামগ্রীর সাথে ফাইলগুলি ভাগ করা উচিত। বিষয়বস্তু ইউআরআই ফাইলটিকে আরও নিরাপদ, ভাগ করার যোগ্য ফ্যাশনে শনাক্ত করে। বিষয়বস্তু URI-তে ফাইলের পাথ থাকে, তবে ফাইলটি প্রদান করে এমন কর্তৃপক্ষ এবং ফাইলটিকে সনাক্তকারী একটি আইডি নম্বরও থাকে। আপনি একটি FileProvider
ব্যবহার করে যেকোনো ফাইলের জন্য একটি সামগ্রী আইডি তৈরি করতে পারেন। তারপরে আপনি সেই সামগ্রী আইডিটি অন্যান্য অ্যাপের সাথে শেয়ার করতে পারেন (এমনকি অন্য প্রোফাইলেও)। প্রাপক প্রকৃত ফাইলে অ্যাক্সেস পেতে সামগ্রী আইডি ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, একটি নির্দিষ্ট ফাইল URI-এর জন্য আপনি কীভাবে সামগ্রী URI পাবেন তা এখানে:
কোটলিন
// Open File object from its file URI val fileToShare = File(fileUriToShare) val contentUriToShare: Uri = FileProvider.getUriForFile( context, "com.example.myapp.fileprovider", fileToShare )
জাভা
// Open File object from its file URI File fileToShare = new File(fileUriToShare); Uri contentUriToShare = FileProvider.getUriForFile(getContext(), "com.example.myapp.fileprovider", fileToShare);
যখন আপনি getUriForFile()
পদ্ধতিতে কল করেন, তখন আপনাকে অবশ্যই ফাইল প্রদানকারীর অথরিটি অন্তর্ভুক্ত করতে হবে (এই উদাহরণে, "com.example.myapp.fileprovider"
), যা আপনার অ্যাপ ম্যানিফেস্টের <provider>
এলিমেন্টে উল্লেখ করা আছে। বিষয়বস্তু URI-এর সাথে ফাইল শেয়ার করার বিষয়ে আরও তথ্যের জন্য, ফাইল শেয়ার করা দেখুন।
বিজ্ঞপ্তির জন্য শুনুন
একটি অ্যাপ সাধারণত বিজ্ঞপ্তিতে পরিবর্তন সম্পর্কে সিস্টেম থেকে কলব্যাক পেতে একটি NotificationListenerService
সাবক্লাস প্রদান করে। কাজের প্রোফাইল সহ ডিভাইসগুলি আপনার অ্যাপের সাথে NotificationListenerService
কীভাবে কাজ করে তা প্রভাবিত করতে পারে।
একটি কাজের প্রোফাইলে
কাজের প্রোফাইলে চলমান একটি অ্যাপ থেকে আপনি NotificationListenerService
ব্যবহার করতে পারবেন না। যখন আপনার অ্যাপটি কাজের প্রোফাইলে চলছে, তখন সিস্টেমটি আপনার অ্যাপের NotificationListenerService
উপেক্ষা করে। যাইহোক, ব্যক্তিগত প্রোফাইলে চলমান অ্যাপগুলি বিজ্ঞপ্তি শুনতে পারে।
ব্যক্তিগত প্রোফাইলে
যখন আপনার অ্যাপটি ব্যক্তিগত প্রোফাইলে চলে, তখন আপনি কাজের প্রোফাইলে চলমান অ্যাপগুলির জন্য বিজ্ঞপ্তি নাও পেতে পারেন৷ ডিফল্টরূপে, সমস্ত ব্যক্তিগত প্রোফাইল অ্যাপ্লিকেশানগুলি কলব্যাক গ্রহণ করে তবে একজন আইটি প্রশাসক এক বা একাধিক ব্যক্তিগত প্রোফাইল অ্যাপ্লিকেশানগুলিকে অনুমতি দিতে পারেন যা তারা বিজ্ঞপ্তি পরিবর্তনের জন্য শোনার অনুমতি দেয়৷ সিস্টেম তখন অ-অনুমোদিত অ্যাপগুলিকে ব্লক করে। Android 8.0 (API লেভেল 26) বা তার পরে, একটি ডিভাইস পলিসি কন্ট্রোলার (DPC) যেটি একটি কাজের প্রোফাইল পরিচালনা করে সেটি আপনার অ্যাপটিকে DevicePolicyManager
পদ্ধতি setPermittedCrossProfileNotificationListeners()
ব্যবহার করে কাজের প্রোফাইলের বিজ্ঞপ্তি শোনা থেকে ব্লক করতে পারে। আপনার অ্যাপ এখনও ব্যক্তিগত প্রোফাইলে পোস্ট করা বিজ্ঞপ্তি সম্পর্কে কলব্যাক গ্রহণ করে।
কাজের প্রোফাইলের সাথে সামঞ্জস্যের জন্য আপনার অ্যাপ পরীক্ষা করুন
কাজের প্রোফাইল সহ একটি ডিভাইসে আপনার অ্যাপটি ব্যর্থ হতে পারে এমন সমস্যাগুলি ধরতে আপনার অ্যাপটিকে একটি কাজের-প্রোফাইল পরিবেশে পরীক্ষা করা উচিত৷ বিশেষ করে, একটি ওয়ার্ক-প্রোফাইল ডিভাইসে পরীক্ষা করা আপনার অ্যাপটি সঠিকভাবে ইন্টেন্টগুলি পরিচালনা করে তা নিশ্চিত করার একটি ভাল উপায়: পরিচালনা করা যায় না এমন ইন্টেন্টগুলি ফায়ার না করা, ক্রস-প্রোফাইলে কাজ করে না এমন URIগুলি সংযুক্ত না করা ইত্যাদি।
আমরা একটি নমুনা অ্যাপ, TestDPC প্রদান করেছি, যেটি আপনি Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে চালিত একটি Android ডিভাইসে একটি কাজের প্রোফাইল সেট আপ করতে ব্যবহার করতে পারেন। এই অ্যাপটি আপনাকে কাজের-প্রোফাইল পরিবেশে আপনার অ্যাপ পরীক্ষা করার একটি সহজ উপায় অফার করে। এছাড়াও আপনি এই অ্যাপটি ব্যবহার করে কাজের প্রোফাইল কনফিগার করতে পারেন:
- পরিচালিত প্রোফাইলে কোন ডিফল্ট অ্যাপ পাওয়া যায় তা উল্লেখ করুন
- কনফিগার করুন কোন উদ্দেশ্যগুলিকে এক প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার অনুমতি দেওয়া হয়েছে৷
আপনি যদি ম্যানুয়ালি একটি ইউএসবি কেবলের মাধ্যমে কোনো অ্যাপ ইনস্টল করেন যার একটি কাজের প্রোফাইল আছে, অ্যাপটি ব্যক্তিগত এবং কাজের প্রোফাইল উভয়েই ইনস্টল করা হয়। একবার আপনি অ্যাপটি ইনস্টল করার পরে, আপনি নিম্নলিখিত শর্তে অ্যাপটি পরীক্ষা করতে পারেন:
- যদি একটি অভিপ্রায় সাধারণত একটি ডিফল্ট অ্যাপ (উদাহরণস্বরূপ, ক্যামেরা অ্যাপ) দ্বারা পরিচালিত হয়, তাহলে কাজের প্রোফাইলে সেই ডিফল্ট অ্যাপটিকে অক্ষম করার চেষ্টা করুন এবং অ্যাপটি যথাযথভাবে এটি পরিচালনা করে কিনা তা যাচাই করুন।
- আপনি যদি অন্য কোনো অ্যাপের দ্বারা পরিচালিত হওয়ার আশা করে কোনো অভিপ্রায় ফায়ার করেন, তাহলে সেই অভিপ্রায়ের অনুমতিটিকে এক প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার জন্য সক্ষম এবং নিষ্ক্রিয় করার চেষ্টা করুন। উভয় পরিস্থিতিতে অ্যাপটি সঠিকভাবে আচরণ করছে কিনা তা যাচাই করুন। যদি অভিপ্রায়টিকে প্রোফাইলের মধ্যে ক্রস করার অনুমতি না দেওয়া হয়, অ্যাপের প্রোফাইলে উপযুক্ত হ্যান্ডলার থাকাকালীন এবং যখন না থাকে উভয় ক্ষেত্রেই অ্যাপের আচরণ যাচাই করুন। উদাহরণস্বরূপ, যদি আপনার অ্যাপ একটি মানচিত্র-সম্পর্কিত অভিপ্রায় চালায়, তাহলে নিম্নলিখিত প্রতিটি পরিস্থিতি চেষ্টা করুন:
- ডিভাইসটি মানচিত্রের উদ্দেশ্যগুলিকে এক প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার অনুমতি দেয় এবং অন্য প্রোফাইলে একটি উপযুক্ত হ্যান্ডলার রয়েছে (যে প্রোফাইলটিতে অ্যাপটি চলছে না)
- ডিভাইসটি মানচিত্রের উদ্দেশ্যগুলিকে প্রোফাইলগুলির মধ্যে ক্রস করার অনুমতি দেয় না, তবে অ্যাপের প্রোফাইলে একটি উপযুক্ত হ্যান্ডলার রয়েছে
- ডিভাইসটি মানচিত্রের অভিপ্রায়গুলিকে প্রোফাইলগুলির মধ্যে ক্রস করার অনুমতি দেয় না এবং ডিভাইসের প্রোফাইলে মানচিত্রের উদ্দেশ্যগুলির জন্য কোনও উপযুক্ত হ্যান্ডলার নেই
- আপনি যদি একটি উদ্দেশ্যের সাথে বিষয়বস্তু সংযুক্ত করেন, তা যাচাই করুন যে অভিপ্রায়টি যখন অ্যাপের প্রোফাইলে পরিচালনা করা হয় এবং যখন এটি প্রোফাইলের মধ্যে অতিক্রম করে উভয় ক্ষেত্রেই সঠিকভাবে আচরণ করে।
কাজের প্রোফাইলে পরীক্ষা করুন: টিপস এবং কৌশল
কাজের-প্রোফাইল ডিভাইসে পরীক্ষা করার জন্য আপনি সহায়ক বলে মনে করতে পারেন এমন কয়েকটি কৌশল রয়েছে।
- উল্লিখিত হিসাবে, আপনি যখন একটি ওয়ার্ক-প্রোফাইল ডিভাইসে একটি অ্যাপ সাইড-লোড করেন, তখন এটি উভয় প্রোফাইলেই ইনস্টল করা হয়। আপনি যদি চান, আপনি একটি প্রোফাইল থেকে অ্যাপটি মুছে ফেলতে পারেন এবং অন্যটিতে রেখে দিতে পারেন।
- অ্যান্ড্রয়েড ডিবাগ ব্রিজ (এডিবি) শেলে উপলব্ধ বেশিরভাগ অ্যাক্টিভিটি ম্যানেজার কমান্ড
--user
ফ্ল্যাগকে সমর্থন করে, যা আপনাকে কোন ব্যবহারকারী হিসাবে চালাতে হবে তা নির্দিষ্ট করতে দেয়। একজন ব্যবহারকারীকে নির্দিষ্ট করে, আপনি অনিয়ন্ত্রিত প্রাথমিক ব্যবহারকারী বা কাজের প্রোফাইল হিসাবে চালাবেন কিনা তা চয়ন করতে পারেন৷ আরও তথ্যের জন্য, ADB শেল কমান্ড দেখুন। - একটি ডিভাইসে সক্রিয় ব্যবহারকারীদের খুঁজে পেতে, adb প্যাকেজ ম্যানেজারের
list users
কমান্ড ব্যবহার করুন। আউটপুট স্ট্রিং-এর প্রথম সংখ্যা হল ইউজার আইডি, যা আপনি--user
পতাকা দিয়ে ব্যবহার করতে পারেন। আরও তথ্যের জন্য, ADB শেল কমান্ড দেখুন।
উদাহরণস্বরূপ, একটি ডিভাইসে ব্যবহারকারীদের খুঁজে পেতে, আপনি এই কমান্ডটি চালাবেন:
$ adb shell pm list users UserInfo{0:Drew:13} running UserInfo{10:Work profile:30} running
এই ক্ষেত্রে, প্রাথমিক ব্যবহারকারীর ("ড্রু") ব্যবহারকারীর আইডি 0 রয়েছে এবং কাজের প্রোফাইলের ব্যবহারকারীর আইডি 10 রয়েছে৷ কাজের প্রোফাইলে একটি অ্যাপ চালানোর জন্য, আপনি এইরকম একটি কমান্ড ব্যবহার করবেন:
$ adb shell am start --user 10 \ -n "com.example.myapp/com.example.myapp.testactivity" \ -a android.intent.action.MAIN -c android.intent.category.LAUNCHER