यह कैसे जांचा जाए कि क्या किसी मंशा को किसी गतिविधि से नियंत्रित किया जा सकता है?


115

मेरे पास अभी तक यह तरीका है, लेकिन यह ऐसा आया जैसे कुछ याद आ रहा है

उदाहरण के लिए मेरे पास एक फ़ाइल / sdcard/sound.3ga है जो झूठी लौटाता है (जैसे कोई गतिविधि नहीं है जो इस प्रकार की फ़ाइल को संभाल सके), लेकिन जब मैं इसे फ़ाइल प्रबंधक से खोलता हूं तो यह मीडिया प्लेयर के साथ बिना किसी समस्या के खुल जाता है

मुझे लगता है कि यह इरादा पूरा नहीं हुआ है और मुझे अपने आत्म-विश्वास को सुनिश्चित करने के लिए कुछ और करने की आवश्यकता है कि हैंडलर एक्सिस्टर्स चर केवल गलत होगा यदि कोई गतिविधि नहीं है जो इस इरादे को संभाल सकती है

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

edwardxu का समाधान मेरे लिए पूरी तरह से काम करता है।

बस थोड़ा स्पष्ट करने के लिए:

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

1
ठीक है, एंड्रॉइड
एपि


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

solutionActivity () अक्सर एक आशय देता है भले ही ऐसा कुछ भी नहीं है जो वास्तव में इसे संभाल सकता है, इसलिए यह इसके लिए काम नहीं करता है। यह मेरे लिए काम करता है।
ग्लेन मेनार्ड

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

ध्यान दें कि यह हमेशा काम नहीं करता है: संकल्पशीलता एक इरादा लौटा सकती है जिसे संभाला नहीं जा सकता है। मेरे लिए queryIntentActivities का दृष्टिकोण बेहतर है।
ग्लेन मेनार्ड

ठीक है, एंड्रॉइड
एपि

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()आशय पर प्रयोग करने पर यह काम नहीं करता है ।
CopsOnRoad

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()
Zun
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.