일부 활동에서 인 텐트를 처리 할 수 ​​있는지 확인하는 방법은 무엇입니까?


115

지금까지이 방법을 가지고 있는데 뭔가 빠진 것 같았습니다

예를 들어 false를 반환하는 /sdcard/sound.3ga 파일이 있지만 (이 유형의 파일을 처리 할 수있는 활동이없는 것처럼) 파일 관리자에서 열면 문제없이 미디어 플레이어로 열립니다.

이 인 텐트가 완전하지 않다고 생각하고이 인 텐트를 처리 할 수있는 활동이없는 경우에만 handlerExists 변수가 거짓임을 확인하기 위해 더 많은 작업이 필요합니다.

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
글쎄, Android api 30+에서는 지금은 항상 작동하지 않습니다.)
user924


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));

잊었 기 때문입니다 : intent.setType ( "text / plain");
Felipe

1
여기서 0 플래그는 무엇입니까?
RyPope

이 <더 플래그> 의미 @RyPope
모하마드 Ersan

setPackage()의도에 사용 하는 경우 실패합니다. 그래서, 우리는 가야Intent.resolveActivity()
CopsOnRoad

resolveActivity ()는 실제로 처리 할 수있는 인 텐트가없는 경우에도 종종 인 텐트를 반환하므로 작동하지 않습니다. 이것은 나를 위해 작동합니다.
Glenn Maynard

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

이것이 항상 작동하는 것은 아닙니다. resolveActivity는 처리 할 수없는 인 텐트를 반환 할 수 있습니다. queryIntentActivities 접근 방식이 더 잘 작동합니다.
Glenn Maynard

글쎄, Android api 30+에서는 지금은 항상 작동하지 않습니다.)
user924

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

Kotlin 사용 인 텐트를 사용할 수 없을 때 무언가를해야하는 경우

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

kotlin 확장을 사용하는 또 다른 접근 방식

 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.