首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用/禁用android.nfc.action.TECH_DISCOVERED IntentFilter

启用/禁用android.nfc.action.TECH_DISCOVERED IntentFilter
EN

Stack Overflow用户
提问于 2019-10-23 15:37:25
回答 1查看 331关注 0票数 0

我想根据用户的设置选择禁用android.nfc.action.TECH_DISCOVERED IntentFilter,以避免出现选择应用程序对话框。

为此,我在我的Android Manifest文件中创建了一个活动别名,并通过PackageManager更改了它的状态:

Anroid Manifest File

代码语言:javascript
复制
<activity
    android:name=".activities.ActivitySplash"
    android:configChanges="orientation"
    android:label="@string/app_name"
    android:launchMode="singleTask"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
<activity-alias
    android:name=".AliasActivitySplash"
    android:targetActivity=".activities.ActivitySplash"
    android:exported="true"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.nfc.action.TECH_DISCOVERED"/>
    </intent-filter>
    <meta-data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/techlist"/>
</activity-alias>

Activity Alias State Management:

代码语言:javascript
复制
public void enableAlias() {
    int newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
    _packageManager.setComponentEnabledSetting(new ComponentName(_packageName, _packageName + "." + 
    "AliasActivitySplash"), newState, PackageManager.DONT_KILL_APP);
}
public void disableAlias() {
    int newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
    _packageManager.setComponentEnabledSetting(new ComponentName(_packageName, _packageName + "." + 
    "AliasActivitySplash"), newState, PackageManager.DONT_KILL_APP);
}  

每次我尝试更改别名状态时,都会得到一个java.lang.SecurityException。我读过将应用程序安装为系统应用程序应该可以解决这个问题。

捕获到异常:

代码语言:javascript
复制
    java.lang.SecurityException: Attempt to change component state; pid=10766, uid=10329, component=packagename/packagename.AliasActivitySplash
        at android.os.Parcel.createException(Parcel.java:2071)
        at android.os.Parcel.readException(Parcel.java:2039)
        at android.os.Parcel.readException(Parcel.java:1987)
        at android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:7336)
        at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:2554)
        at packagename.activities.alias.ActivitySplashAliasManager.disableAlias(ActivitySplashAliasManager.java:27)
        at packagename.fragments.FragmentPreferences.onPreferenceChange(FragmentPreferences.java:83)
        at androidx.preference.Preference.callChangeListener(Preference.java:1118)
        at androidx.preference.TwoStatePreference.onClick(TwoStatePreference.java:67)
        at androidx.preference.Preference.performClick(Preference.java:1182)
        at androidx.preference.Preference.performClick(Preference.java:1166)
        at androidx.preference.SwitchPreferenceCompat.performClick(SwitchPreferenceCompat.java:193)
        at androidx.preference.Preference$1.onClick(Preference.java:181)
        at android.view.View.performClick(View.java:7140)
        at android.view.View.performClickInternal(View.java:7117)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27351)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
2019-10-24 09:21:43.863 10766-10766/packagename E/Test:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: android.os.RemoteException: Remote stack trace:
        at com.android.server.pm.PackageManagerService.setEnabledSetting(PackageManagerService.java:21250)
        at com.android.server.pm.PackageManagerService.setComponentEnabledSetting(PackageManagerService.java:21184)
        at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:3473)
        at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:4015)
        at android.os.Binder.execTransactInternal(Binder.java:1021)

我做错了什么吗?或者有没有其他方法可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-10-24 16:36:41

我终于解决了这个问题。问题是我获取包名的方式。我的应用程序有多个版本配置,我试图禁用/启用设备上安装的其他版本的组件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58517789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档