Diskuze: Zobrazení aktivity na popředí


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"/>
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.
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.getAktivacePoplachu()" 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;
}
}
Matúš Olejník:23.1.2020 13:43
Prepáč, nedal si odpovedať tak mi neprišla notifikácia
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.
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á.
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????
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.
Zobrazeno 9 zpráv z 9.