Android প্ল্যাটফর্ম ডিভাইসে অফিস প্রোফাইল (কখনও কখনও ম্যানেজ করা প্রোফাইল হিসেবে উল্লেখ করা হয়) রাখার অনুমতি দেয়। অফিস প্রোফাইল আইটি অ্যাডমিন দ্বারা নিয়ন্ত্রিত হয় এবং এতে উপলভ্য কার্যকারিতা ব্যবহারকারীর প্রাথমিক প্রোফাইলের কার্যকারিতা থেকে আলাদাভাবে সেট করা হয়। এই পদ্ধতির মাধ্যমে সংস্থাগুলি ব্যবহারকারীর ডিভাইসে কোম্পানি-নির্দিষ্ট অ্যাপ এবং ডেটা চালানোর পরিবেশ নিয়ন্ত্রণ করতে পারে, পাশাপাশি ব্যবহারকারীদের তাদের ব্যক্তিগত অ্যাপ এবং প্রোফাইল ব্যবহার করার অনুমতিও দেয়।
এই টিউটোরিয়াল থেকে আপনি জানতে পারবেন যে কীভাবে আপনার অ্যাপ্লিকেশন পরিবর্তন করবেন যাতে এটি অফিস প্রোফাইল সহ ডিভাইসে নির্ভরযোগ্যভাবে কাজ করে। সাধারণ অ্যাপ-ডেভেলপমেন্ট পেশাদার পদ্ধতি ছাড়া আপনাকে আর কিছু করতে হবে না। তবে, এর মধ্যে কিছু পেশাদার পদ্ধতি বিশেষ করে অফিস প্রোফাইল সহ ডিভাইসের ক্ষেত্রে গুরুত্বপূর্ণ হয়ে ওঠে। এই ডকুমেন্টে সেইসব সমস্যার কথা উল্লেখ করা হয়েছে যেগুলি সম্পর্কে আপনাকে সচেতন থাকতে হবে।
এক নজরে
ব্যবহারকারীরা প্রায়ই এন্টারপ্রাইজ সেটিংয়ে তাদের ব্যক্তিগত ডিভাইস ব্যবহার করতে চান। এই পরিস্থিতি সংস্থাগুলিকে একটি দ্বিধায় ফেলতে পারে। ব্যবহারকারী নিজের ডিভাইস ব্যবহার করলে, সংস্থাকে এই নিয়ে চিন্তিত থাকতে হয় যে গোপনীয় তথ্য (যেমন কর্মচারীর ইমেল ও পরিচিতি) এমন ডিভাইসে আছে যা সংস্থা নিয়ন্ত্রণ করে না।
এই পরিস্থিতি সামাল দিতে, Android 5.0 (API লেভেল 21) সংস্থাগুলিকে অফিস প্রোফাইল সেট-আপ করার অনুমতি দেয়। কোনও ডিভাইসে অফিস প্রোফাইল থাকলে, প্রোফাইলের সেটিংস আইটি অ্যাডমিনের নিয়ন্ত্রণে থাকে। আইটি অ্যাডমিন বেছে নিতে পারবেন যে কোন অ্যাপগুলি সেই প্রোফাইলের জন্য অনুমোদিত এবং প্রোফাইলের জন্য কোন ডিভাইস ফিচারগুলি উপলভ্য তা নিয়ন্ত্রণ করতে পারবেন।
কোনও ডিভাইসে অফিস প্রোফাইল থাকলে, ডিভাইসে চলা অ্যাপের উপর তার প্রভাব পড়ে, অ্যাপটি কোন প্রোফাইলের অধীনে চলছে তা বিবেচ্য নয়:
- ডিফল্ট হিসেবে, বেশিরভাগ ইনটেন্ট একটি প্রোফাইল থেকে অন্য প্রোফাইলে যায় না। প্রোফাইলে চলা কোনও অ্যাপ যদি ইনটেন্ট ফায়ার করে, সেই প্রোফাইলে ইনটেন্টের জন্য কোনও হ্যান্ডলার না থাকে এবং প্রোফাইল সংক্রান্ত বিধিনিষেধের কারণে ইনটেন্টকে অন্য প্রোফাইলে যাওয়ার অনুমতি না দেওয়া হয়, তাহলে অনুরোধটি ব্যর্থ হয় এবং অ্যাপটি অপ্রত্যাশিতভাবে বন্ধ হয়ে যেতে পারে।
- অফিস প্রোফাইলে কোন কোন সিস্টেম অ্যাপ উপলভ্য থাকবে তা প্রোফাইল আইটি অ্যাডমিন সীমিত করতে পারেন। এই বিধিনিষেধের ফলে অফিস প্রোফাইলে কিছু সাধারণ ইনটেন্টের জন্য কোনও হ্যান্ডলার নাও থাকতে পারে।
- ব্যক্তিগত ও অফিস প্রোফাইলের জন্য আলাদা স্টোরেজ থাকে, তাই একটি প্রোফাইলের জন্য বৈধ ফাইল URI অন্য প্রোফাইলের জন্য বৈধ নয়। একটি প্রোফাইলে চালানো যেকোনও ইনটেন্ট অন্য প্রোফাইলে (প্রোফাইল সেটিংসের উপর নির্ভর করে) ম্যানেজ করা হতে পারে, তাই ইনটেন্টে ফাইল URI অ্যাটাচ করা নিরাপদ নয়।
ব্যর্থ ইনটেন্ট প্রতিরোধ করুন
অফিস প্রোফাইল সহ ডিভাইসে, ইনটেন্ট এক প্রোফাইল থেকে অন্য প্রোফাইলে যেতে পারবে কিনা তার উপর বিধিনিষেধ আছে। বেশিরভাগ ক্ষেত্রে, কোনও ইনটেন্ট ট্রিগার করা হলে, যে প্রোফাইলে এটি ট্রিগার করা হয়েছে সেখানেই এটি ম্যানেজ করা হয়। সেই প্রোফাইলে ইনটেন্টের জন্য কোনও হ্যান্ডলার না থাকলে, ইনটেন্টটি হ্যান্ডেল করা হয় না এবং যে অ্যাপটি এটি চালু করেছে সেটি অপ্রত্যাশিতভাবে বন্ধ হয়ে যেতে পারে—এমনকি অন্য প্রোফাইলে ইনটেন্টের জন্য কোনও হ্যান্ডলার থাকলেও।
প্রোফাইল অ্যাডমিন বেছে নিতে পারবেন যে কোন ইনটেন্ট একটি প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার অনুমতি পাবে। আইটি অ্যাডমিন এই সিদ্ধান্ত নেন বলে, কোন ইনটেন্ট এই সীমানা অতিক্রম করতে পারবে তা আগে থেকে জানার কোনও উপায় আপনার কাছে নেই। আইটি অ্যাডমিন এই নীতি সেট করেন এবং যেকোনও সময় এটি পরিবর্তন করতে পারেন।
আপনার অ্যাপ কোনও অ্যাক্টিভিটি শুরু করার আগে, আপনাকে যাচাই করতে হবে যে উপযুক্ত রেজোলিউশন
আছে কিনা। আপনি
Intent.resolveActivity() নম্বরে কল করে যাচাই করতে পারেন যে কোনও গ্রহণযোগ্য রেজোলিউশন আছে কিনা। ইনটেন্ট সমাধান করার কোনও উপায় না থাকলে, মেথড null রিটার্ন করে। পদ্ধতিটি নন-নাল রিটার্ন করলে, ইনটেন্ট সমাধান করার অন্তত একটি উপায় আছে এবং
ইনটেন্টটি ফায়ার করা নিরাপদ। এই ক্ষেত্রে, ইনটেন্ট
সমাধান করা যেতে পারে, কারণ বর্তমান প্রোফাইলে
একটি হ্যান্ডলার আছে অথবা ইনটেন্টকে অন্য প্রোফাইলের হ্যান্ডলারে
ক্রস করার অনুমতি দেওয়া হয়েছে। (ইনটেন্ট সমাধান করার ব্যাপারে আরও তথ্যের জন্য, সাধারণ ইনটেন্ট দেখুন।)
যেমন, আপনার অ্যাপকে টাইমার সেট করতে হলে, এটি চেক করতে হবে যে
ACTION_SET_TIMER ইনটেন্টের জন্য কোনও সঠিক হ্যান্ডলার আছে কিনা। অ্যাপটি ইনটেন্ট সমাধান করতে না পারলে, এটিকে একটি উপযুক্ত পদক্ষেপ নিতে হবে (যেমন একটি ত্রুটি মেসেজ
দেখানো)।
Kotlin
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-এর সাথে ফাইল শেয়ার করা উচিত। কন্টেন্ট URI
আরও সুরক্ষিত, শেয়ার করার মতো পদ্ধতিতে ফাইল শনাক্ত করে। কন্টেন্ট URI-তে ফাইল পাথ, ফাইল প্রদানকারী কর্তৃপক্ষ এবং ফাইল শনাক্ত করার জন্য একটি আইডি নম্বর থাকে। আপনি FileProvider ব্যবহার করে যেকোনও ফাইলের জন্য Content ID তৈরি করতে পারবেন। আপনি তারপর সেই কন্টেন্ট
ID অন্য অ্যাপের (এমনকি অন্য প্রোফাইলেও) সাথে শেয়ার করতে পারবেন। প্রাপক আসল ফাইল অ্যাক্সেস করতে
কন্টেন্ট আইডি ব্যবহার করতে পারবেন।
যেমন, নির্দিষ্ট ফাইল URI-এর জন্য আপনি কীভাবে কন্টেন্ট URI পাবেন তা এখানে দেওয়া হল:
Kotlin
// 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 লেভেল ২৬) বা তার পরবর্তী ভার্সনে, অফিস প্রোফাইল ম্যানেজ করে এমন ডিভাইস নীতি
কন্ট্রোলার (DPC), DevicePolicyManager
পদ্ধতি
setPermittedCrossProfileNotificationListeners() ব্যবহার করে অফিস প্রোফাইলের বিজ্ঞপ্তি শোনার ক্ষেত্রে আপনার অ্যাপকে ব্লক করতে পারে।
আপনার অ্যাপ এখনও ব্যক্তিগত প্রোফাইলে পোস্ট করা বিজ্ঞপ্তি সম্পর্কে কলব্যাক
পায়।
অফিস প্রোফাইলের সাথে আপনার অ্যাপ মানানসই কিনা তা পরীক্ষা করুন
অফিস প্রোফাইল আছে এমন ডিভাইসে আপনার অ্যাপ যাতে কোনও সমস্যার কারণে কাজ করা বন্ধ না করে দেয়, তা নিশ্চিত করতে অফিস প্রোফাইল এনভায়রনমেন্টে অ্যাপটি পরীক্ষা করে দেখুন। বিশেষ করে, আপনার অ্যাপ ইনটেন্ট সঠিকভাবে ম্যানেজ করছে কিনা তা নিশ্চিত করার জন্য অফিস-প্রোফাইল ডিভাইসে পরীক্ষা করা একটি ভালো উপায়: ম্যানেজ করা যায় না এমন ইনটেন্ট ফায়ার না করা, ক্রস-প্রোফাইলে কাজ করে না এমন URI অ্যাটাচ না করা এবং আরও অনেক কিছু।
আমরা একটি স্যাম্পেল অ্যাপ, TestDPC প্রদান করেছি, যা আপনি Android 5.0 (API লেভেল 21) এবং তার পরবর্তী যেকোনও ভার্সনে চলা Android ডিভাইসে অফিস প্রোফাইল সেট-আপ করতে ব্যবহার করতে পারেন। এই অ্যাপটি আপনাকে অফিস-প্রোফাইল পরিবেশে আপনার অ্যাপ পরীক্ষা করার একটি সহজ উপায় অফার করে। এছাড়াও, আপনি এই অ্যাপ ব্যবহার করে নিম্নলিখিত উপায়ে অফিস প্রোফাইল কনফিগার করতে পারবেন:
- ম্যানেজ করা প্রোফাইলে কোন ডিফল্ট অ্যাপ উপলভ্য তা নির্দিষ্ট করুন
- কোন কোন ইনটেন্ট এক প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার অনুমতি পাবে তা কনফিগার করুন the other
আপনি যদি কোনও ডিভাইসে USB কেবেলের মাধ্যমে ম্যানুয়ালি কোনও অ্যাপ ইনস্টল করেন, যে ডিভাইসে অফিস প্রোফাইল আছে, তাহলে অ্যাপটি ব্যক্তিগত ও অফিস প্রোফাইল উভয় ক্ষেত্রেই ইনস্টল করা হয়। অ্যাপ ইনস্টল করার পরে, আপনি নিম্নলিখিত শর্তে অ্যাপটি পরীক্ষা করতে পারবেন:
- কোনও ইনটেন্ট সাধারণত ডিফল্ট অ্যাপ (যেমন, ক্যামেরা অ্যাপ) দ্বারা ম্যানেজ করা হলে, অফিস প্রোফাইলে সেই ডিফল্ট অ্যাপ বন্ধ করে দেখুন এবং অ্যাপটি এটি সঠিকভাবে ম্যানেজ করছে কিনা তা যাচাই করুন।
- আপনি যদি কোনও ইনটেন্ট ফায়ার করেন এবং আশা করেন যে অন্য কোনও অ্যাপ সেটি ম্যানেজ করবে, তাহলে
এক প্রোফাইল থেকে অন্য প্রোফাইলে যাওয়ার জন্য সেই ইনটেন্টের অনুমতি চালু ও বন্ধ করে
দেখুন। দুটি পরিস্থিতিতেই অ্যাপটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করুন। যদি
ইনটেন্টকে প্রোফাইলগুলির মধ্যে ক্রস করার অনুমতি না দেওয়া হয়, তাহলে অ্যাপের প্রোফাইলে উপযুক্ত হ্যান্ডলার থাকলে এবং না থাকলে, উভয় ক্ষেত্রেই অ্যাপের আচরণ যাচাই করুন।
যেমন, আপনার অ্যাপ ম্যাপ-সম্পর্কিত ইনটেন্ট ফায়ার করলে, নিম্নলিখিত প্রতিটি পরিস্থিতি
চেক করে দেখুন:
- ডিভাইসটি ম্যাপ ইনটেন্টকে একটি প্রোফাইল থেকে অন্য প্রোফাইলে ক্রস করার অনুমতি দেয় এবং অন্য প্রোফাইলে একটি উপযুক্ত হ্যান্ডলার আছে (যে প্রোফাইলে অ্যাপটি চলছে না)
- ডিভাইসটি ম্যাপ ইনটেন্টকে প্রোফাইলগুলির মধ্যে ক্রস করার অনুমতি দেয় না, তবে অ্যাপের প্রোফাইলে একটি উপযুক্ত হ্যান্ডলার রয়েছে
- ডিভাইসটি ম্যাপ ইনটেন্টকে প্রোফাইলগুলির মধ্যে ক্রস করার অনুমতি দেয় না এবং ডিভাইসের প্রোফাইলে ম্যাপ ইনটেন্টের জন্য কোনও উপযুক্ত হ্যান্ডলার নেই
- আপনি কোনও ইনটেন্টে কন্টেন্ট অ্যাটাচ করলে, ইনটেন্টটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করুন অ্যাপের প্রোফাইলে এটি ম্যানেজ করার সময় এবং প্রোফাইলগুলির মধ্যে ক্রস করার সময় উভয় ক্ষেত্রেই।
অফিস প্রোফাইলে পরীক্ষা করা: পরামর্শ এবং উপায়
ওয়ার্ক-প্রোফাইল ডিভাইসে পরীক্ষা করার সময় আপনাকে সাহায্য করতে পারে এমন কিছু কৌশল এখানে দেওয়া হল।
- যেমনটি উল্লেখ করা হয়েছে, আপনি অফিস প্রোফাইল ডিভাইসে কোনও অ্যাপ সাইড-লোড করলে, সেটি দুটি প্রোফাইলেই ইনস্টল হয়ে যায়। আপনি চাইলে, একটি প্রোফাইল থেকে অ্যাপটি মুছে ফেলতে পারেন এবং অন্যটিতে রেখে দিতে পারেন।
- Android ডিবাগ ব্রিজ (adb) শেলে উপলভ্য বেশিরভাগ অ্যাক্টিভিটি ম্যানেজার কমান্ড
--userফ্ল্যাগকে সাপোর্ট করে, যা আপনাকে কোন ব্যবহারকারী হিসেবে রান করতে হবে তা নির্দিষ্ট করতে দেয়। কোনও ব্যবহারকারীকে নির্দিষ্ট করে, আপনি ম্যানেজ না করা প্রাথমিক ব্যবহারকারী বা অফিস প্রোফাইল হিসেবে রান করবেন কিনা তা বেছে নিতে পারবেন। আরও তথ্যের জন্য, ADB শেল কমান্ড দেখুন। - কোনও ডিভাইসে অ্যাক্টিভ ব্যবহারকারীদের খুঁজে পেতে, adb প্যাকেজ ম্যানেজারের
list usersকমান্ড ব্যবহার করুন। আউটপুট স্ট্রিংয়ের প্রথম নম্বরটি হল ব্যবহারকারীর আইডি, যা আপনি--userফ্ল্যাগের সাথে ব্যবহার করতে পারবেন। আরও তথ্যের জন্য, ADB Shell Commands দেখুন।
যেমন, কোনও ডিভাইসে ব্যবহারকারীদের খুঁজতে, আপনি এই কমান্ডটি রান করবেন:
$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} runningএই ক্ষেত্রে, প্রাথমিক ব্যবহারকারীর("Drew") ইউজার আইডি হল 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