Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
discount week 80
Avatar
Martin
Člen
Avatar
Martin:18.1.2020 15:50

Ahojte,
potřebuji poradit jak zobrazit aktivitu na uzamčené obrazovce. Mám aplikaci, který mně běží na pozadí a reaguje na sms. Pokud mám aplikaci aktivní, a aplikace se aktivuje funguje správně, aktivita se zobrazí. Pokud aplikace běží na pozadí musím aplikaci otevřít abych viděl aktivovanou aktivitu. Potřeboval bych nejlépe aby se aktivita zobrazila i na uzamčené obrazovce nebo ihned po odemčení. Zkoušel jsem nějaké postupy z internetu ale nic nefunguje. Nemáte nějakou zkušenost??? Děkuji.
PS: Snad jsem se do toho nezamotal, kdyby bylo nejasné tak pište, jsem v koncích.

 
Odpovědět
18.1.2020 15:50
Avatar
Odpovídá na Martin
Matúš Olejník:19.1.2020 11:44

Ahoj, nerobím s Androidom, ale niečo podobné som skúšal asi pred viac ako rokom a zabralo až niečo takéto. Nehovorím, že je to 100% dobré riešenie, asi by som zbúchal niečo krajšie keby tomu obetujem viacej času. Tiež som si všimol, že je tam teraz dosť veci deprecated, ale s tým už sa môžeš pohrať a upraviť to podľa odporúčaní v JavaDocu.

import android.app.KeyguardManager;
import android.content.Context;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {

    private PowerManager.WakeLock wakeLock;

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

        turnOnLockScreen();
    }

    private void turnOnLockScreen() {
        KeyguardManager.KeyguardLock keyguardLock = ((KeyguardManager) getSystemService(KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
        PowerManager powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
        wakeLock = powerManager.newWakeLock(
                PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP,
                "myapp:TAG"
        );

        keyguardLock.disableKeyguard();
        wakeLock.acquire();

        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
        );
    }

    private void turnOffLockScreen() {
        if(wakeLock != null){
            wakeLock.release();
        }
        finish();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        turnOffLockScreen();
    }
}

Plus do manifestu treba pridať

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Nahoru Odpovědět
19.1.2020 11:44
/* I am not sure why this works but it fixes the problem */
Avatar
Martin
Člen
Avatar
Odpovídá na Matúš Olejník
Martin:21.1.2020 9:55

Takže bohužel, kód jsem sice nahrál ale bez reakce, aplikaci musím otevřít. Ale děkuji za typ.

 
Nahoru Odpovědět
21.1.2020 9:55
Avatar
Odpovídá na Martin
Matúš Olejník:21.1.2020 10:06

Môžeš ukázať kúsok tvojho kódu kde to používaš? :)

Nahoru Odpovědět
21.1.2020 10:06
/* I am not sure why this works but it fixes the problem */
Avatar
Martin
Člen
Avatar
Martin:21.1.2020 10:40

Takže jsem se na to ještě jednou díval (už je to nějaký čas co jsem tento projekt dělal a z tohoto důvodu odložil), a já jsem to tenkrát udělal jako přímé otevření konkrétní aktivity když se otvírá MainActivity tak se rovnou aktualizuje na AlertList, ale já ten AlertList potřebuji otevřít rovnou jak nastavuji tu proměnou "global.getAk­tivacePoplachu()" takže nejlépe z třídy global. Možná upřesnění. Potřebuji otevřít aktivitu AlertList na uzamčené obrazovce z třídy Blobal. Ještě jsem si všimnul, že telefon má samostatně povolení pro aplikaci aby jej mohla otevřít což by asi měla vyžadovat ale nic nechce, tak nevím zda nejsou špatně nastavené požadavky. Děkuji, že se mně snažíš pomoct, jak vidíš dle kódu nejsem žádnej programátor ale snažím se.

public class MainActivity extends AppCompatActivity {
    Global global;
    Button buttonGroupSMS;
    Button buttonSetGroupSMS;
    Button buttonSetAlarmSMS;
    Button buttonVyjezd;
    CheckBox checkBoxTichyRezimM;
    private PowerManager.WakeLock wakeLock;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        global = (Global) getApplication();
        buttonGroupSMS = (Button) findViewById(R.id.groupSMS);
        buttonSetGroupSMS = (Button) findViewById(R.id.setGroupSMS);
        buttonSetAlarmSMS = (Button) findViewById(R.id.setAlarmSMS);
        buttonVyjezd = (Button) findViewById(R.id.buttonPosledniVyjezd);
        checkBoxTichyRezimM = (CheckBox) findViewById(R.id.checkBoxTichyRezim);
        turnOnLockScreen();

        //Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);


        getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
        );

        update();
    }
    private void turnOnLockScreen() {
        KeyguardManager.KeyguardLock keyguardLock = ((KeyguardManager) getSystemService(KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
        PowerManager powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
        wakeLock = powerManager.newWakeLock(
                PowerManager.FULL_WAKE_LOCK
                        | PowerManager.ACQUIRE_CAUSES_WAKEUP,
                "myapp:TAG"
        );

        keyguardLock.disableKeyguard();
        wakeLock.acquire();

        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
        );
    }
    private void turnOffLockScreen() {
        if(wakeLock != null){
            wakeLock.release();
        }
        finish();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        turnOffLockScreen();
    }

    public void clicksetAlarmSMS(View m){
        Intent intent = new Intent(this, setAlarmSMS.class);
        startActivity(intent);
    }

    public void clickVyjed(View m){
        Intent intent = new Intent(this, AlertList.class);
        startActivity(intent);
    }

    public void clickShowInformace(View m){
        Intent intent = new Intent(this, Informace.class);
        startActivity(intent);
    }

    public void clickchangeTichyRezimM(View m){
        if (checkBoxTichyRezimM.isChecked()) {
            global.setTicho(true);
            Toast.makeText(this, "Aktivní tichý režim aplikace.", Toast.LENGTH_LONG).show();
        } else {
            global.setTicho(false);
        }
    }

    private void update(){
        if(global.getPovoleniGroupSMS()){
            buttonGroupSMS.setVisibility(View.GONE);
        }else {
            buttonGroupSMS.setVisibility(View.VISIBLE);
        }
        if(global.getTicho()){
            checkBoxTichyRezimM.setChecked(true);
        }else{
            checkBoxTichyRezimM.setChecked(false);
        }
        if(global.getAktivacePoplachu()) {
            global.setAktivacePoplachu(false);
            Intent intent = new Intent(this, AlertList.class);
            startActivity(intent);
        }
    }

    @Override
    protected void onResume(){
        super.onResume();
        update();
        if(!control()) {
            MainControl();
        }else{

        }
    }


    public void MainControl(){
        if(!control()){

            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Nedostatečná oprávnění");
            builder.setMessage("Zkontrolujte nastevení oprávnění pro aplikaci:\n- Přístup k SMS \n- Přístup ke kontaktům \n- Nerušit");
            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){
                @Override
                public void onClick(DialogInterface dialog, int which){

                }
            });
            builder.show();


        }else {

        }
    }

    public Boolean control(){
        Boolean results = false;
        Boolean resultsSMS = false;
        Boolean resultsCON = false;
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_CONTACTS)) {
                //Toast.makeText(MainActivity.this, "Není povolené čtení kontaktů", Toast.LENGTH_SHORT).show();
                resultsCON = false;
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            }
        }else{
           // Toast.makeText(MainActivity.this, "Čtení kontaktů povoleno.", Toast.LENGTH_SHORT).show();
            resultsCON = true;
        }

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.SEND_SMS)
                != PackageManager.PERMISSION_GRANTED) {
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.SEND_SMS)) {
             //   Toast.makeText(MainActivity.this, "Není povolen přístup k SMS", Toast.LENGTH_SHORT).show();
                resultsSMS = false;
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            }
        }else{
           // Toast.makeText(MainActivity.this, "Přístup k SMS povolen.", Toast.LENGTH_SHORT).show();
            resultsSMS = true;
        }
        if(resultsCON && resultsSMS){
            results = true;
        }else {
            results = false;
        }

        return results;
    }

}
 
Nahoru Odpovědět
21.1.2020 10:40
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Martin
Matúš Olejník:23.1.2020 13:43

Prepáč, nedal si odpovedať tak mi neprišla notifikácia :D
Popíš ešte raz prosím ako to testuješ pri zapnutej obrazovke.

Máš priamo aj spustenú aplikáciu?
Toto čo si poslal je už želaná aktivita, ktorá sa má ukázať pri prijatí SMS, či to je až tá AlertList?
Máš istotu, že ti pri vypnutej aplikácii naozaj počúva či prišla nová SMS?
Chcelo by to asi aj poslať kód ktorý ti má spustiť túto MainActivity aktivitu.

Nahoru Odpovědět
23.1.2020 13:43
/* I am not sure why this works but it fixes the problem */
Avatar
Martin
Člen
Avatar
Odpovídá na Matúš Olejník
Martin:23.1.2020 21:19

Aplikace se v emulátoru chová jak má, když vypnu prostředí a pošlu SMS tak se zobrazí jak Aktivita tak přehraje zvuk.
V Globalu mám tuto funkci, která by měla přehrát zvuk a zobrazit aktivitu, zvuk se pustí vždy, ikdyž je telefon zamčený, ale aktivita je bez reakce. Ani třeba nenaskočí hned po odemčení (což by mně taky stačilo) Tak musím vždy odemčím, najít ikonku aplikace, otevřít.

 public void novaSMS(String number, String message){
            setPosledniVyjezd(message);

            spustiAlarm(getOpakovaniZvuk());

            Intent intent = new Intent(this, AlertList.class);
            startActivity(intent);
}

Při aktivaci se má pustit aktivita AlertList. MainAktivita se pustí automaticky pokud spustíš aplikaci, je to vlastně první co se načítá.

 
Nahoru Odpovědět
23.1.2020 21:19
Avatar
Martin
Člen
Avatar
Odpovídá na Matúš Olejník
Martin:23.1.2020 21:34

A nepopletl jsem to??? Nemá být ten kód co jsi mně poslal v té aktivitě co chci zobrazit tedy v AlertList ne v MainAktivity????

 
Nahoru Odpovědět
23.1.2020 21:34
Avatar
Martin
Člen
Avatar
Odpovídá na Matúš Olejník
Martin:23.1.2020 21:52

Teď jsem to zkoušel, a i pokud mám telefon odemčený a aplikaci na pozadí tak se spustí zvuk ale display bez reakce.

 
Nahoru Odpovědět
23.1.2020 21:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.