在我的 Activity 中,我有一个 WebView ,在 manifest.xml 中,我声明了这样的 Intent 过滤器
<activity
android:name=".ui.socialNetwork.MySocialNetworkActivity"
android:configChanges="orientation|screenSize"
android:process=":fb"
android:screenOrientation="portrait" >
</activity>
<activity-alias
android:targetActivity=".ui.socialNetwork.MySocialNetworkActivity"
android:name=".AliasMySocialNetworkActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity-alias>
这不是启动器 Activity 。 此处使用的 Intent 过滤器用于在 Web View 长按时复制粘贴工具栏。这很好用。 除此之外,我想使用 Webview.setOnLongClickListener() 作为附加选项,我是这样实现的。
webView = (WebView) findViewById(R.id.webview);
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
webView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
WebView.HitTestResult hitResult = null;
hitResult = webView.getHitTestResult();
if (hitResult != null && hitResult.getExtra() != null) {
final String hitRes = hitResult.getExtra();
if (hitResult.getType() == WebView.HitTestResult.IMAGE_TYPE || hitResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
Intent ImageSaveIntent = new Intent(getApplicationContext(), SaveImage.class);
ImageSaveIntent.putExtra("putImage", hitRes);
startActivity(ImageSaveIntent);
}
if (hitResult.getType() != WebView.HitTestResult.IMAGE_TYPE || hitResult.getType() != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}
return true;
}
});
我的问题是
如果我单独使用 intent 过滤器而不使用 webview.setOnLongClickListener(),我可以在 webview 中复制粘贴文本
如果我单独使用 webview.setOnLongClickListener(),我可以执行其他选项并且它工作正常。
如果我同时实现 Intent 过滤器和 webview.setOnLongClickListener(),我无法从 webview 复制粘贴文本。 webview.setOnLongClickListener() 会正常工作。在这里我了解到这两个功能都依赖于 longPress,但我希望两者一起工作。
我在 Webview.HitResult 选项中搜索了 TextType,但它没有这样的选项。 https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
最佳答案
您可以使用 Activity Alias 执行此操作(以编程方式禁用 android list 中的 intent 过滤器):
1) 将 AndroidManifest.xml 中的(例如 AliasMySocialNetworkActivity)添加到您的 MySocialNetworkActivity 并将您的 intent-filter 移至它们。它看起来像这样:
<activity-alias
android:targetActivity=".MySocialNetworkActivity"
android:name=".AliasMySocialNetworkActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity-alias>
2) 添加此代码以在需要时抑制别名 Activity 中的 intent-filter
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
3) 在需要时恢复 intent-filter:
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
更新
其实你不需要Alias,只需要使用PackageManager.COMPONENT_ENABLED_STATE_DISABLED
/PackageManager.COMPONENT_ENABLED_STATE_ENABLED
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".MySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
直接针对您的 Activity 。谢谢@pskink。
关于android - 以编程方式禁用 android list 中的 Intent 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505357/