android sdk, ошибка: java.lang.SecurityException: отказ в разрешении: попытка изменить состояние компонента

#java #android

#java #Android

Вопрос:

По сути, я пытаюсь удалить значок приложения и оставить его по-прежнему установленным, используя этот пример: http://www.helloandroid.com/tutorials/removing-app-icon-launcher

Код, который я пытаюсь запустить с помощью android studio, является :

 package com.example.root.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.content.ComponentName ;

import android.content.pm.PackageManager ;

public class java_test extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java_test);

        ComponentName componentToDisable =
                new ComponentName("com.nll.acr",
                        "com.nll.acr.LauncherActivity");

        getPackageManager().setComponentEnabledSetting(
                componentToDisable,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

    }
}
  

автоматически созданный файл manifest xml содержит :

 <?xml version="1.0" encoding="utf-8"?>   
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/activity_java_test"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:exported="true"
    tools:context="com.example.root.myapplication.java_test">



    <TextView
        android:exported="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
  

Ошибка, которую я продолжаю получать, это

 EXCEPTION: main
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.root.myapplication/com.example.root.myapplication.java_test}: java.lang.SecurityException: Permission Denial: attempt to change component state from pid=1300, uid=10154, package uid=10150
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2265)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2315)
  

Я просмотрел Интернет и подумал, что мне нужно где-то поместить в xml это ‘android: enabled =»true»‘ , но это просто выдает другую ошибку :

android.view.Исключение InflateException: строка двоичного XML-файла # 15: Ошибка при раздувании класса service

Обновление: я закомментировал строку

    getPackageManager().setComponentEnabledSetting(
            componentToDisable,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
  

Теперь он работает нормально

Но мне нужно, чтобы эта строка работала, чтобы иметь возможность удалить ярлык

ОБНОВИТЕ 3, если я попробую это :

затем компилятор сообщает, что «layout_height» и «layout_width» отсутствуют

если я попытаюсь :

     <activity
        android:name=".LoginActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustResize|stateHidden"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <TextView
        android:exported="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
  

Он жалуется, что «Ошибка, раздувающая активность класса»

ОБНОВЛЕНИЕ 4 :

если я попытаюсь :

 android:layout_width="match_parent"
android:layout_height="match_parent"

android:name=".LoginActivity"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize|stateHidden"
android:exported="true">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
  

затем компилятор сообщает, что «layout_height» и «layout_width» отсутствуют

Комментарии:

1. вы проверили, разрешено ли CHANGE_COMPONENT_ENABLED_STATE?

2. также почему android: exported=»true» в Textview?

Ответ №1:

попробуйте это

 <activity
   android:name=".LoginActivity"
   android:label="@string/app_name"
   android:windowSoftInputMode="adjustResize|stateHidden" 
   android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  

используйте android:exported="true" внутри manifest , а не в layout

Комментарии:

1. все еще сталкиваетесь с той же проблемой?

2. да: строка двоичного XML-файла # 14: Ошибка, увеличивающая активность класса

3. Ганеш, я знаю, что неправильно указал «<activity ../>», куда мне его поместить?

4. Я обновил сообщение ОБНОВЛЕНИЯМИ 3 и 4 , я попробовал «<activity ../>» как внутри RelativeLayout , так и получил разные результаты

5. добавьте это в AndroidManifest.xml не в макетах … 3 и 4 являются файлами макета