sourceSets { main { java { srcDirs 'src\\main\\java', 'src\\main\\Dialoge', 'src\\main\\java\\Dialoge' } } }
wieso gibst du das an?
sourceSets { main { java { srcDirs 'src\\main\\java', 'src\\main\\Dialoge', 'src\\main\\java\\Dialoge' } } }
wieso gibst du das an?
Habe mit mehreren APPs , wie "Dateimanager" getestet, d.h. Doppelklick auf die APK startet die Installation und bricht dann ab.
mit welcher Fhlermeldung?
Ohne Entwickler Optionen frei geben und erlauben Install von unbekannten Quellen wird es nicht gehen.
Support Libs würde ich auch nicht meht benutzen.
muss das sein?
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
reicht sicher auch.
Ich verstehe nicht wo dein Problem ist. Eine APK mit Taget und MinSdk grösser als 24 solltest du auch mit Android 14 installieren können.
Auch ohne Google Play. Schalte die Entwickler Optionen frei und erlaube Install von unbekannten Quellen.
Ist die APK-Taget älter wirst du das ADB brauchen
Momentan ist es ja so das Google alle Apk die das Target kleiner als 23 (Android 5 geht somit nicht mehr) haben nicht installiert.
Seid ihr wirklich so rückschrittlich das ihr da Probleme habt?
Hallo
Interessant wäre welches Handy und Android Version (API) es ist.
Du sagst Permission-Fehler hast du die überhaupt vom User zur Laufzeit geholt und hart der User da auch zugestimmt.
Bedenke hierbei auch das bei neueren API-Versionen, bei einen ablehnen der Permission vom User, das System nicht erneut nachfragt, auch wenn du das in Code machst.
Auch ab API 29 sollte es mit TelephonyManager und getImei( int sloiIndex) gehen . Permission vorausgesetzt
getIDeviceId ist seit API 29 deprecated
PS. was meinst du mit PIN-System?
String getSdpath() {
File[] exFileDirs = getExternalFilesDirs(null);
String sdpath = exFileDirs[1].toString();
int pos = 0;
for (int i = 0; i < 3; i++) {
pos = sdpath.indexOf('/', pos);
pos++;
}
return sdpath.substring(0, pos);
}
dies geht auch mit Api 34 ++++
getExternalFilesDirs() added in API 8
Zitatps, die Permissien zur laufzeit stört mich nicht, is ja nur einmal ein klick.…
Keiner hat gesagt ob es dich stört. Ich habe nur erwähnt das man es ab Api 23 benutzen muss also den Code dazu benutzen schreiben muss. Egal ob es dir oder den User gefällt . Google will es eben so. das war alles.
Zitatnochwas, was ist dieses "SAF", ich sollte mir ja auch mal ein neues händy kaufen,
Storage Access Framework (SAF)
Open files using the Storage Access Framework | Android Developers
Du kannst für Bilder auch den MediaProvider / MediaStore benutzen.
MediaProvider-Modul | Android Open Source Project
Zitatich hab ne app root-explorer geladen und der zeigt für den pfad: "6631-3661" an.
Wenn du denn Code aus post #8 Benutzen würdest hättest du auch den richtigen Path bekommen. Und zwar die ID der SD-Karte. Dies macht Google schon seit Android MM API 23 so.
aber egal. so geht es..
Dazu würde mich mal interessieren wie du auf die Datei zugreift mit deiner URI die du erstellt hast.
Zeige das mal.
Android 8.1 also API 27
Und ab Api 23 benötigst du Permissien vom user zur Laufzeit bestätigt.
Zweitens ab API 26 echte SD karte Zugriff nur noch mit SAF möglich.
Scoped Storage
Ps das Thema hatte wir doch vor 4 Jahren schon mal.
welche sdk version hat das Tab und das Handy?
Du willst von der echten Physikalischen SD-Karte lesen hast du überhaupt die Permission dazu ?
ImageView iv = findViewById(R.id.imageView);
Bitmap btmp = BitmapFactory.decodeFile(getSdpath()+"test/test.jpg");
iv.setImageBitmap(btmp);
}
String getSdpath() {
File[] exFileDirs = getExternalFilesDirs(null);
String sdpath = exFileDirs[1].toString();
int pos = 0;
for (int i = 0; i < 3; i++) {
pos = sdpath.indexOf('/', pos);
pos++;
}
return sdpath.substring(0, pos);
}
Alles anzeigen
PS: nur bis API 22
emulated/0
ist ja auch auf neueren Geräten richtig. Für die internen fest verbaute Sdkarte.
Nochmal welche Android Version und welcher speicher Bereich?
Um es auf einem alten 5.0 Tab zu testen muss ich erst den Akku laden.
String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
sollte dir den richtigen paht geben.
Es macht keinen sinn wenn du beim Test von checkSelfPermission in den Else Zweig kommst, dort auf die Datei zugreifen zu wollen denn du hast sie ja noch nicht.
Das erfährst du ja erst in der onRequestPermissionsResult.
beachte auch dies.
Request runtime permissions | Android Developers
At the same time, your app should respect the user's decision to deny a permission. Starting in Android 11 (API level 30), if the user taps Deny for a specific permission more than once during your app's lifetime of installation on a device, the user doesn't see the system permissions dialog if your app requests that permission again. The user's action implies "don't ask again." On previous versions, users saw the system permissions dialog each time your app requested a permission, unless they had previously selected a "don't ask again" checkbox or option.
If a user denies a permission request more than once, this is considered a permanant denial. It's very important to only prompt users for permissions when they need access to a specific feature, otherwise you might inadvertently lose the ability to re-request permissions.
In certain situations, the permission might be denied automatically, without the user taking any action. (A permission might be granted automatically as well.) It's important to not assume anything about automatic behavior. Each time your app needs to access functionality that requires a permission, check that your app is still granted that permission.
To provide the best user experience when asking for app permissions, also see App permissions best practices.
Sorry das ist ja Adroino C/++ da wie in Java Stringvergleich mit "equels" nicht "=="
hatte es nicht getestet nur im Editor geschrieben.
schaltet die Pins ein und aus
if (header.indexOf("GET /2/an") >= 0) {
if( output3Stat.equals("aus") ){
Serial.println("Hochfahren 2 an");
output2State = "an";
digitalWrite(output2, HIGH);
}
} else if (header.indexOf("GET /2/aus") >= 0) {
Serial.println("Hochfahren 2 aus");
output2State = "aus";
digitalWrite(output2, LOW);
} else if (header.indexOf("GET /3/an") >= 0) {
if (output2State.equals("aus")){
Serial.println("Runterfahren 3 an");
output3State = "an";
digitalWrite(output3, HIGH);
}
Alles anzeigen
du solltest nicht einfach auf den Mensch vertrauen das er die Button richtig bedient.
Vor dem setzen des Ausgangs zb Hoch (otput2) solltest du prüfen das der Ausgang runter (output3) nicht aktiv ist also Low .
Eine gegenseitige Verrieglung der Ausgänge.
// schaltet die Pins ein und aus
if (header.indexOf("GET /2/an") >= 0) {
Serial.println("Hochfahren 2 an");
if( output3==LOW ){
output2State = "an";
digitalWrite(output2, HIGH);
}
} else if (header.indexOf("GET /2/aus") >= 0) {
Serial.println("Hochfahren 2 aus");
output2State = "aus";
digitalWrite(output2, LOW);
} else if (header.indexOf("GET /3/an") >= 0) {
Serial.println("Runterfahren 3 an");
if (output2==LOW){
output3State = "an";
digitalWrite(output3, HIGH);
}
Alles anzeigen
Dies kannst du natürlich auf der Webseite im HTML Code auch machen.
Hallo hier mal ein einfaches Beispiel für einen Web Sever auf dem ESP 32.
So wie du mittels einer HTML-Seite auf die GPIO der ESP zugreifen kannst.
Ich hoffe du kannst ein wenig HTLM und auch C/ C++ um den Code zu verstehen.
Dann überlege doch mal was beim Drehen des Handys passiert. Die Activity oder auch das Fragment wird neu gestartet .
Die onCreatd wird wieder aufgerufen und auch das Layout wird neu geladen.
Auch wenn deine Views die gleiche ID haben sind es nach den drehen wider andere Instanzen.
Auch Instanzvariablen werden zerstört. Somit auch deine „taskPicture“
Nicht umsonst wird der onCreate das savedInstanceState mit gegeben.
Schaue dir an wie du das für dich nutzen kannst.