কোনও ক্রিয়াকলাপ থেকে কোনও অভিপ্রায় পরিচালনা করা যায় কিনা তা কীভাবে পরীক্ষা করবেন?


115

আমার এখনও অবধি এই পদ্ধতিটি রয়েছে তবে এটি এমন কিছু এসেছিল যা কিছু অনুপস্থিত

উদাহরণস্বরূপ আমার কাছে একটি ফাইল রয়েছে /sdcard/sound.3ga যা মিথ্যা ফিরিয়ে দেয় (যেমন এই ধরণের ফাইল পরিচালনা করতে পারে এমন কোনও ক্রিয়াকলাপ নেই) তবে আমি যখন ফাইল ম্যানেজারটি খুলি তখন এটি মিডিয়া প্লেয়ারের সাথে কোনও সমস্যা ছাড়াই খোলে no

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

PackageManager pm = getPackageManager();
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uriString)).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
intent.setDataAndType(Uri.fromFile(new File(uriString)),mimetype);
boolean handlerExists = intent.resolveActivity(pm) != null;

উত্তর:


149

এডওয়ার্ডক্সুর সমাধান আমার পক্ষে পুরোপুরি কার্যকর।

কিছুটা স্পষ্ট করার জন্য:

PackageManager packageManager = getActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent);
} else {
    Log.d(TAG, "No Intent available to handle action");
}

1
ভাল, অ্যান্ড্রয়েড এপিআই 30+ সহ, এটি এখন সবসময় কাজ করে না)
ব্যবহারকারী924


86
PackageManager manager = context.getPackageManager();
List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
if (infos.size() > 0) {
    //Then there is an Application(s) can handle your intent
} else {
    //No Application can handle your intent
}

আপনি কি এই অভিপ্রায় চেষ্টা করেছেন?

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(yourFileHere));

কারণ আপনি ভুলে গেছেন: ইন্টেন্ট.সেটটাইপ ("পাঠ্য / প্লেইন");
ফিলিপ

1
এখানে 0 পতাকা কি?
রাইপোপ

@ রাইপপ এর অর্থ <কোনও পতাকা নেই>
মোহাম্মদ এরশান

আমরা যদি setPackage()অভিপ্রায়টি ব্যবহার করি তবে এটি ব্যর্থ হবে। সুতরাং, আমাদের উচিতIntent.resolveActivity()
CopsOnRoad

সমাধানঅ্যাক্টিভিটি () প্রায়শই একটি অভিপ্রায় ফিরে আসে এমনকি বাস্তবে এটি পরিচালনা করতে পারে এমন কিছু না থাকলেও এটি এর জন্য কার্যকর হয় না। এটি আমার পক্ষে কাজ করে।
গ্লেন মেইনার্ড

51
if (intent.resolveActivity(getPackageManager()) == null) {
    // No Activity found that can handle this intent. 
}
else{
    // There is an activity which can handle this intent. 
}

মনে রাখবেন যে এটি সর্বদা কার্যকর হয় না: রেজোলিউশনএটিভিটি হ্যান্ডেল করা যায় না এমন একটি অভিপ্রায় ফিরে আসতে পারে। ক্যোয়ারেন্টএন্টিটিভিটিস অ্যাপ্রোচ আমার জন্য আরও ভাল কাজ করে।
গ্লেন মেইনার্ড

ভাল, অ্যান্ড্রয়েড এপিআই 30+ সহ, এটি এখন সবসময় কাজ করে না)
ব্যবহারকারী924

2

তুমি ব্যবহার করতে পার:

public static boolean isAvailable(Context ctx, Intent intent) {
   final PackageManager mgr = ctx.getPackageManager();
   List<ResolveInfo> list =
      mgr.queryIntentActivities(intent, 
         PackageManager.MATCH_DEFAULT_ONLY);
   return list.size() > 0;
}

setPackage()অভিপ্রায়টি ব্যবহার করার সময় এটি কাজ করে না ।
কপসঅনরোড

1

কোটলিন ব্যবহার করে যখন অভিপ্রায়টি পাওয়া যায় না তখন আপনাকে কিছু করতে হবে,

fun isIntentAvailable(
                context: Context,
                action: String?
            ): Boolean {
                val packageManager = context.packageManager
                val intent = Intent(action)
                val resolveInfo: List<*> = packageManager.queryIntentActivities(
                    intent,
                    PackageManager.MATCH_DEFAULT_ONLY
                )
                return resolveInfo.isNotEmpty()
            }

হিসাবে এই পদ্ধতি বাস্তবায়ন

private const val SAMPLE_INTENT = "com.realwear.barcodereader.intent.action.SCAN_BARCODE"



 if(isIntentAvailable(this,SAMPLE_INTENT)){
  //Do Stuff
 }

আপনার কিছু করার না থাকলে,

Intent(SAMPLE_INTENT).also { barcodeReaderIntent ->
            barcodeReaderIntent.resolveActivity(packageManager)?.also {
                barcodeReaderIntent.putExtra(EXTRA_CODE_128, false)
                startActivityForResult(barcodeReaderIntent, BARCODE_REQUEST_CODE)
            }
    }

0

কোটলিন এক্সটেনশন ব্যবহার করে আরেকটি পদ্ধতি

 fun Context.isIntentAvailable(intent: Intent): Boolean {
    val resolveInfo: List<*> = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return resolveInfo.isNotEmpty()
 }

খণ্ডের ভিতরে ব্যবহার

val available = requireContext().isIntentAvailable(this)

ক্রিয়াকলাপের ভিতরে ব্যবহার

val available = this.isIntentAvailable(this)

PackageManagerপরিবর্তে আপনার নিজের এক্সটেনশান মজাদার জন্য ব্যবহার করা উচিত Contextএবং এড়ানো উচিতPackageManager.MATCH_DEFAULT_ONLY
user924

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