Android BOOT_COMPLETE не получено - PullRequest
1 голос
/ 27 марта 2020

Я довольно новичок в Android: я провел несколько экспериментов и повторных поисков в Интернете, но я не понял, откуда появилась моя проблема ... Я хотел бы, чтобы мое приложение получило широковещательное сообщение BOOT_COMPLETE, но для неизвестная причина, я не хочу, чтобы это работало. Симптомы таковы: кажется, что он работает на эмуляторе либо при запуске, либо с помощью команды

shell am broadcast -a android.intent.action.BOOT_COMPLETED -n <myapp>/.BootReceiver

Однако, это не работает на моем "реальном ТВ". Еще хуже: я попробовал другие приложения, которые используют это широковещательное сообщение, и они работают (например, Aurora или Launch-on-boot ) как на «реальном» телевизоре, так и на эмуляторе ... Так как их код открыто, я проверяю, но я не нашел, что не так в моем коде ... Из того, что я смог найти isung adb на реальном ТВ, является то, что трансляция не отправляется в мое приложение, но для других: *

2020-03-25 17:25:23.800 1796-3309/? I/ActivityManager: Start proc 6054:com.aurora.store/u0a96 for broadcast com.aurora.store/.receiver.BootReceiver
2020-03-25 17:25:26.163 1796-3228/? I/ActivityManager: Start proc 6126:com.github.yeriomin.yalpstore/u0a24 for broadcast com.github.yeriomin.yalpstore/.BootReceiver

Поэтому, я хотел бы попросить некоторую помощь, любая подсказка будет приветствоваться ...

Вот мой манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.eds.testtvapp">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.software.leanback"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:banner="@mipmap/ic_launcher"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            android:name=".ConfigActivity"
            android:theme="@style/Theme.Leanback">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.REBOOT" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

Здесь приемник вещания

package com.eds.testtvapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;


public class BootReceiver extends BroadcastReceiver {
    private static final String LOG_TAG = BootReceiver.class.getPackage() + "_" + BootReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        Log.i(LOG_TAG, "onReceive");
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ) {
            Log.i(LOG_TAG, "Start from boot");
            Intent anIntent = new Intent( context, MainActivity.class);
            anIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //start activity from boot, so do it silently
            Bundle bundle = new Bundle();
            bundle.putBoolean(context.getString(R.string.app_data_start), true);
            anIntent.putExtras(bundle);
            context.startActivity(anIntent);
        }
    }
}

Моя основная деятельность (единственная)

package com.eds.testtvapp;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;

import android.view.View;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;

import android.util.Log;


public class MainActivity extends Activity implements
        View.OnClickListener,
        CompoundButton.OnCheckedChangeListener {
    // debugging info
    private static final String LOG_TAG = MainActivity.class.getPackage() + "_" + MainActivity.class.getSimpleName();

    Button mButtonToast;    // button to create a toast
    Button mButtonSnack;    // button to create a snackbar
    Switch mSwitch;         // switch to select toast or snackbar at boot

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

        Log.i(LOG_TAG, "Start");
        mButtonToast = findViewById(R.id.button_toast);
        mButtonSnack = findViewById(R.id.button_snack);
        mSwitch = findViewById(R.id.switch_toast_snack);
        boolean bFromBoot = false;
        // retrieve config (or default)
        getPreferencesData();

        // register listeners (after initial set to to avoid switch initialisation to issue a message)
        mSwitch.setOnCheckedChangeListener(this);
        mButtonToast.setOnClickListener(this);
        mButtonSnack.setOnClickListener(this);

        try {
            Bundle bundle = getIntent().getExtras();
            if (bundle!= null) {
                bFromBoot = bundle.getBoolean(getString(R.string.app_data_start));
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, "Error creating main display");
        }
        // if started from boot
        if (bFromBoot) {
            // display something according to settings
            if(mSwitch.isChecked())  {
                Snackbar.make(this.findViewById(android.R.id.content),
                        "Boot Snackbar", Snackbar.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Boot Toast", Toast.LENGTH_SHORT)
                        .show();
            }
            // avoid UI to be started
            finish();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // restore values
        Log.i(LOG_TAG, "Resume");
        getPreferencesData();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // store values
        Log.i(LOG_TAG, "Pause");
        setPreferencesData();
    }

    protected void getPreferencesData() {
        Log.i(LOG_TAG, "Get boot type of message from configuration");
        // Get from the SharedPreferences
        SharedPreferences settings = getApplicationContext().getSharedPreferences(getString(R.string.app_data), MODE_PRIVATE);
        // get saved switch selector value
        String sBootMsgType = settings.getString(getString(R.string.config_switch_selection),getString(R.string.config_switch_Default));
        boolean bBootMsgType = Boolean.parseBoolean(sBootMsgType);
        // sets the UI
        mSwitch.setChecked(bBootMsgType);
    }

    protected void setPreferencesData() {
        Log.i(LOG_TAG, "Sets boot type of message in configuration");
        // Get from the SharedPreferences
        SharedPreferences settings = getApplicationContext().getSharedPreferences(getString(R.string.app_data), MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        // get port value and status from UI
        String sBootMsgType = String.valueOf(mSwitch.isChecked());
        // commit the changes
        editor.putString(getString(R.string.config_switch_selection),sBootMsgType);
        editor.apply();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_toast:
                Toast.makeText(this, "This is a toast", Toast.LENGTH_SHORT)
                        .show();
                break;

            case R.id.button_snack:
                Snackbar.make(this.findViewById(android.R.id.content),
                        "This is a snack", Snackbar.LENGTH_LONG).show();
                break;
        }
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Log.i(LOG_TAG, "Selector configuration changed");
        switch (buttonView.getId()) {
            case R.id.switch_toast_snack:
                if( isChecked ) {
                    Snackbar.make(this.findViewById(android.R.id.content),
                            "Snackbar used at boot", Snackbar.LENGTH_LONG).show();
                } else {
                    Toast.makeText(this, "Toast used at boot", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
        }
    } // end onCheckedChanged
}

мой файл build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29


    defaultConfig {
        applicationId "com.eds.testtvapp"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.leanback:leanback:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.1.0'

}

и, просто чтобы завершить мои стили. xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="AppTheme" parent="@style/Theme.Leanback" />
</resources>

и строки. xml

<resources>
    <string name="app_name">TestTVApp</string>

    <string name="app_data">APPLICATION_DATA</string>
    <string name="app_data_start">FROM_BOOT</string>
    <string name="config_switch_selection">TOAST_OR_SNACK</string>

    <string name="config_switch_Default">false</string>
</resources>

Насколько я мог видеть, ничто не является (с точки зрения кода) неправильным по отношению к реализации, получающей это широковещательное сообщение. Любая подсказка будет приветствоваться ..

Спасибо !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...