지금까지이 방법을 가지고 있는데 뭔가 빠진 것 같았습니다
예를 들어 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;
답변
edwardxu의 솔루션은 저에게 완벽하게 작동합니다.
조금 명확히하기 위해 :
PackageManager packageManager = getActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent);
} else {
Log.d(TAG, "No Intent available to handle action");
}
답변
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));
답변
if (intent.resolveActivity(getPackageManager()) == null) {
// No Activity found that can handle this intent.
}
else{
// There is an activity which can handle this intent.
}
답변
당신이 사용할 수있는:
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;
}
답변
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)
}
}
답변
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)