如何检查是否可以在API 30+(Android 10+,R)上处理意图?



低于 30 API 我可以使用两种方法来检查某些应用程序活动是否可以处理意图:

fun Intent.canBeHandled(packageManager: PackageManager): Boolean {
return resolveActivity(packageManager) != null
}
fun PackageManager.isIntentCanBeHandled(intent: Intent): Boolean {
val infos = queryIntentActivities(intent, 0)
return infos.isNotEmpty()
}

但是当我在 Pixel 3 API 30 模拟器上进行测试时,它无法按预期工作,例如queryIntentActivities()通常返回 0 或 1(例如,1 表示发送意图,而它应该是 7,就像 API 29 一样(

基本上Intent.createChooser(intent, "")工作正常并建议 2 个应用程序(例如(,但 ext 功能Intent.canBeHandled()&PackageManager.isIntentCanBeHandled()返回 false

需要将意图创建为选择器 - 请参考以下示例的最后几行:

public class MainActivity extends AppCompatActivity {
private static final String cstLogTag = "Implicit Intents";
private enum enuShare {shareCompat, shareSheet, intentResolver}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void buttonClicked(View view) {
EditText editText;
String strText, strButton;
Uri uri;
Intent chooser, intent;
chooser = intent = null;
switch (view.getId()) {
case R.id.btnWebsite:
strButton = "btnWebsite";
editText = findViewById(R.id.edtWebsite);
strText = editText.getText().toString();
uri = Uri.parse(strText);
intent = new Intent(Intent.ACTION_VIEW, uri);
break;
case R.id.btnLocation:
strButton = "btnLocation";
editText = findViewById(R.id.edtLocation);
strText = editText.getText().toString();
uri = Uri.parse("geo:0,0?q=" + strText);
intent = new Intent(Intent.ACTION_VIEW, uri);
break;
case R.id.btnShareText:
strButton = "btnShareText";
editText = findViewById(R.id.edtShareText);
strText = editText.getText().toString();
intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, strText);
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Testing");
break;
default:
Log.d(cstLogTag, "Button not recognised");
return;
}
//intent.resolveActivity(getPackageManager()) returns null so...
chooser = Intent.createChooser(intent, "Choose");
if(chooser.resolveActivity(getPackageManager()) == null)
Log.d(cstLogTag, "Unresolved activity for " + strButton);
else
startActivity(chooser);
}

}

最新更新