以编程方式从android清单中禁用意图过滤器 [英] disable the intent filter from android manifest programmatically
问题描述
在我的活动中,我有一个Web视图,在manifest.xml中,我声明了这样的意图过滤器
In my activity I have a web view and in manifest.xml I have declared intent filter like this
<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>
这不是启动器活动. 此处使用的意图过滤器用于长按Web视图上的复制粘贴工具栏.这很好. 除此之外,我想将Webview.setOnLongClickListener()用作其他选项,并且这样实现.
This is not launcher activity. The intent filter used here is for copy paste toolbar on web view long press. This works fine. In addition to this I want to use Webview.setOnLongClickListener() for additional options, and I implemented like this.
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;
}
});
我的问题是
-
如果我单独使用意图过滤器而不使用webview.setOnLongClickListener(),则可以将文本复制粘贴到webview中
If I use intent filter alone without webview.setOnLongClickListener(), I can copy paste the text in webview
如果我单独使用webview.setOnLongClickListener(),我可以做其他选择,并且效果很好.
If I use webview.setOnLongClickListener() alone, I can do my additional options and it is working fine.
如果我同时实现了意图过滤器和webview.setOnLongClickListener(),则无法从webview复制粘贴文本. webview.setOnLongClickListener()可以正常工作.在这里,我了解到这两个功能都取决于longPress,但是我希望两者一起工作.
If I implement both intent filter and webview.setOnLongClickListener(), I cannot copy paste the text from webview. webview.setOnLongClickListener() will work fine. Here I understood that both functionalities depends on longPress, But I want both to work together.
我在Webview.HitResult选项中搜索了TextType,但没有这种选项. https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
I searched Webview.HitResult options for TextType, but it is not having such option. https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html
推荐答案
您可以使用活动别名"执行此操作(以编程方式从android清单中禁用意图过滤器):
You can do this (disable the intent filter from android manifest programatically) by using Activity Alias:
1)将AndroidManifest.xml中的(例如AliasMySocialNetworkActivity)添加到MySocialNetworkActivity中,然后将您的意图过滤器移至其中.看起来像这样:
1) add (e.g. AliasMySocialNetworkActivity) in AndroidManifest.xml to your MySocialNetworkActivity and move your intent-filter to them. It will be looks like that:
<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)添加此代码以在需要时抑制别名活动中的意图过滤器
2) add this code to suppress intent-filter in alias activity when You need that
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
3)在需要时还原意图过滤器:
3) restore intent-filter, when You need it:
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
有关更多详细信息,请参见此或
For more details see this or that answer.
更新
实际上您不需要别名,只需使用PackageManager.COMPONENT_ENABLED_STATE_DISABLED
/PackageManager.COMPONENT_ENABLED_STATE_ENABLED
Actually You don't need Alias, just use 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);
直接针对您的活动.谢谢@pskink.
directly on your activity. Thanks @pskink.
这篇关于以编程方式从android清单中禁用意图过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!