So, ich habe eine andere Lösung gefunden.
Ich habe einen php Server iim Netz, wo ich den Login via einer PHP Datei durchführe.
Grüße
R.
So, ich habe eine andere Lösung gefunden.
Ich habe einen php Server iim Netz, wo ich den Login via einer PHP Datei durchführe.
Grüße
R.
Hallo Zusammen,
hat jemand eine gute Webseite als Link, wo die Installation und Implementierung eines OAuth 2.0 Server gut erklärt ist.
Ich verwende "AeonFree" als Provider.
Leider scheinbar kein "ssh" Zugriff für eine Installation nach "https://github.com/bshaffer/oauth2-demo-php".
Viele Grüße
R.
Hi,
kein Problem. Ich kämpfe selber gerade mit dem Zeug. Hier muss man leider auch nebenbei eine Menge lesen.
Viele Grüße
R.
Hi,
nur ja, sehr viel traffic ist hier wirklich nicht, aber dafür in deutsch. Wenn Du mehr erwartest, musst Du Dich im englisch einsprachigen Bereich umsehen.
Zu. 1
Generell will ich Dich nicht vom prozeduraler Programmierung abbringen. Diese Ansatz ist nur nicht mehr zeitgemäß.
https://de.wikipedia.org/wiki/…rientierte_Programmierung
Hier auch ein Buch zu Java:
http://openbook.rheinwerk-verlag.de/javainsel/
Zu. 2
Das wird über den Eventhandler gemacht.
Das gesamte Konzept kannst Du hier nachlesen (leider nur in englisch)
https://developer.android.com/docs
zu 3.
Da ich in Java die ganze mache, kann ich Dir in Kotline nicht helfen.
Schau Dir diese PDF mal an.
https://www.uni-trier.de/filea…/doku/android/android.pdf
Im Kapitel 6 wird der Lebenszyklus einer App erklärt. Vielleicht hilft das ja das Verständnis zu verbessern.
Eine Menge Beispiele kannst Du auch hier finden:
https://github.com/android
Hier schau ich auch immer mal nach, wie andere das machen. Leider sind die Beispiele nicht immer aktuell
und die meisten sind leider nur in Java.
Viele Grüße
R.
Hi,
hier mal ein paar Antworten. Da ich selber aber nicht der Spezialist bin. Nur unter Vorbehalt.
1) - Kapselung
- Wiederverwendung von erstellten Programmen
- Vererbung
Komplexe Probleme lassen sich nur noch so sicher lösen
2) Android, Mac, Windows und auch Linux auf Grafischen Oberflächen arbeiten
Ereignisse orientiert
Dies hat den Vorteil, das ich nicht mehr prüfen muss, ob sich ein Status geändert hat.
Die entsprechende Routine wird bei Änderung aufgerufen.
Daher ist das Programmaufbau am Anfang (init) gleich, aber danach wartet das Programm
nur noch auf Ereignisse
3) Ich habe mir damals ein Buch gekauft und das anhand der Beispiele dann durchgespielt.
Da ich früher auch Assembler und C programmiert habe, war der Umstieg für mich auch
schwer. Der Vorteil liegt aber klar auf der Hand.
Leider kann ich keine gute Seite empfehlen, da ich hierbei bereits festgestellt habe, das
eine Menge Beispiele auf alte Android-Versionen aufbauen.
Wenn Du also das ganze für die aktuelle Android-Version lernen willst, wirst Du nicht
um ein Buch drumherum kommen. (Vielleicht hast Du oder jemand anderes bessere Ideen)
3.2 Hier muss ich passen
4.0 Hier muss ich passen.
Viele Grüße
R.
Entsprechendes Beispiel hier gefunden.
https://github.com/nilymar/TestingAndroidxPreferences
Viele Grüße
R.
Hallo Zusammen,
ich suche derzeit gutes Beispiel, um mir die Systematik für die Erstellung einer eigenen Preference.
In meiner jetzigen Lösung wird die Vorschau in den Settings nicht dargestellt und ich weiss nicht, wo mein
Fehler ist.
Ich habe bis jetzt eine SettingsFragment, welche die Standard-Preference Werte korrekt anzeigt.
Kurzer Ausschnitt
public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
private EditTextPreference KeyAccountName;
private PasswordPreference KeyPassword;
private EditTextPreference KeyPlatName;
private EditTextPreference KeyDriverName;
Für die Klasse "PasswordPreference" habe ich folgende Klasse:
public class PasswordPreference extends DialogPreference {
private String sPassword="";
private EditText Password =null;
private int mDialogLayoutResId = R.layout.password_pref_layout;
public PasswordPreference(Context context){
this(context, null);
}
public PasswordPreference(Context context, AttributeSet attrs) {
this(context, null,0);
}
public PasswordPreference(Context context, AttributeSet attrs,
int defStyleAttr) {
this(context, attrs, defStyleAttr, defStyleAttr);
}
public PasswordPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
// setWidgetLayoutResource(mDialogLayoutResId);
setDialogLayoutResource(mDialogLayoutResId);
setPositiveButtonText(android.R.string.ok);
setNegativeButtonText(android.R.string.cancel);
}
/*
* Gets the text from the {@link SharedPreferences}.
*
* @return The current preference value.
*/
public String getText() {
return sPassword;
}
public String getPassword(){
return sPassword;
}
public void setPassword(String sPass){
sPassword=sPass;
persistString(sPassword);
}
@Override
public CharSequence getSummary() {
return super.getSummary();
}
@Override
public void setSummary(CharSequence sSum){
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
// Default value from attribute. Fallback value is set to 0.
return a.getString(index);
}
@Override
public int getDialogLayoutResource() {
return mDialogLayoutResId;
}
}
Alles anzeigen
Ebenso ein Klasse "PasswordPreferenceDialogFragmentCompat"
public class PasswordPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
EditText Password;
EditText ConfirmPassword;
EncryptedData encData = null;
private static final int SALT_BYTES = 8;
private static final int PBK_ITERATIONS = 1000;
private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String PBE_ALGORITHM = "PBEwithSHA256and128BITAES-CBC-BC";
private static final String USED_PASSWORD ="ParkPlatzHilfe!1234";
@Override
public void onDialogClosed(boolean positiveResult) {
String sPassword;
if(positiveResult) {
sPassword = Password.getText().toString();
// Get the related Preference and save the value
DialogPreference preference = getPreference();
if (preference instanceof PasswordPreference) {
PasswordPreference passwordPreference =
((PasswordPreference) preference);
// This allows the client to ignore the user value.
if (passwordPreference.callChangeListener(
sPassword)) {
// Save the value
passwordPreference.setPassword(sPassword);
}
}
}
}
public static PasswordPreferenceDialogFragmentCompat newInstance(
String key) {
final PasswordPreferenceDialogFragmentCompat
fragment = new PasswordPreferenceDialogFragmentCompat();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
Password= view.findViewById(R.id.editPassword);
// Get the password from the related Preference
String sPass = null;
DialogPreference preference = getPreference();
if (preference instanceof PasswordPreference) {
sPass=((PasswordPreference) preference).getPassword();
}
if(sPass != null){
Password.setText(sPass);
}
}
/*
String password = "ParkPlatzHilfe!1234";
byte[] data = sPassword.getBytes("UTF-8");
EncryptedData encData = encrypt(password, data);
byte[] decryptedData = decrypt(password, encData.salt, encData.iv, encData.encryptedData);
String decDataAsString = new String(decryptedData, "UTF-8");
*/
private static class EncryptedData {
public byte[] salt;
public byte[] iv;
public byte[] encryptedData;
}
private EncryptedData encrypt(String password, byte[] data) throws NoSuchPaddingException,
NoSuchAlgorithmException,
InvalidKeySpecException,
InvalidKeyException,
BadPaddingException,
IllegalBlockSizeException,
InvalidAlgorithmParameterException {
EncryptedData encData = new EncryptedData();
SecureRandom rnd = new SecureRandom();
encData.salt = new byte[SALT_BYTES];
encData.iv = new byte[16]; // AES block size
rnd.nextBytes(encData.salt);
rnd.nextBytes(encData.iv);
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), encData.salt, PBK_ITERATIONS);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
Key key = secretKeyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(encData.iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
encData.encryptedData = cipher.doFinal(data);
return encData;
}
private byte[] decrypt(String password, byte[] salt, byte[] iv, byte[] encryptedData) throws NoSuchAlgorithmException,
InvalidKeySpecException,
NoSuchPaddingException,
InvalidKeyException,
BadPaddingException,
IllegalBlockSizeException,
InvalidAlgorithmParameterException {
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, PBK_ITERATIONS);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
Key key = secretKeyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
return cipher.doFinal(encryptedData);
}
//return the password in asterisks
private String setAsterisks(int length) {
StringBuilder sb = new StringBuilder();
for (int s = 0; s < length; s++) {
sb.append("*");
}
return sb.toString();
}
}
Alles anzeigen
Hier der Ausschnitt aus der Preference.xml
<com.example.android.parkhilfeclient.PasswordPreference
android:key="@string/key_Password"
android:dialogMessage="@string/prefs_summary_category_Password"
app:defaultValue="@string/pref_Password"
app:key="@string/key_Password"
app:summary="@string/pref_Password"
app:title="@string/prefs_summary_category_Password"/>
Das Ergebis ist jedenfalls, das in den Settings ein leerer Eintrag angezeigt wird und ich trotz setzen von Breakpoint nicht gefunden habe wo es klemmt.
Viele Grüße
R.
Hallo Zusammen,
folgendes war bei mir die Lösung:
Siehe auch:
https://stackoverflow.com/ques…asked-password-text-field
Hier die Preferences.xml
<EditTextPreference
android:key="@string/key_Password"
app:defaultValue="@string/pref_Password"
app:key="@string/key_Password"
app:summary="@string/pref_Password"
app:title="@string/prefs_summary_category_Password"/>
Hier die Klasse:
KeyPassword.setOnPreferenceChangeListener(this);
if (KeyPassword != null) {
//set input type as password and set summary with asterisks the new password
KeyPassword.setOnBindEditTextListener(
new EditTextPreference.OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull final EditText editText) {
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
KeyPassword.setSummaryProvider(new Preference.SummaryProvider() {
@Override
public CharSequence provideSummary(Preference preference) {
return setAsterisks(editText.getText().toString().length());
}
});
}
});
}
//return the password in asterisks
private String setAsterisks(int length) {
StringBuilder sb = new StringBuilder();
for (int s = 0; s < length; s++) {
sb.append("*");
}
return sb.toString();
}
Alles anzeigen
Jetzt muss ich nur noch eine Routine finden, wie ich
a) beim Aufruf die Eingabe lösche
b) beim O.K. ein Confirm der Eingabe abfrage.
Viele Grüße
R.
Hallo Ryan,
die Eingabe
"android:password="true""
wurde direkt abgewiesen. (durchgestrichen).
Die Eingabe
<EditTextPreference
android:key="@string/key_Password"
android:inputType="textPassword"
app:defaultValue="@string/pref_Password"
app:key="@string/key_Password"
app:summary="@string/pref_Password"
app:title="@string/prefs_summary_category_Password"/>
hat leider auch nicht zum Erfolg geführt. Es wurden immer noch die Zeichen während der Eingabe angezeigt.
Hier das Beispiel aus der Simu. (Tippfehler im Text gerade gesehen )
Diese Angaben hatte ich vorher schon gesehen und ausprobiert, leider ohne Erfolg.
Was machen ich den falsch ?
Hier meine Abhängigkeiten zum Vergleich
dependencies {
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'org.osmdroid:osmdroid-android:6.1.6'
implementation 'mysql:mysql-connector-java:5.1.49'
implementation 'com.google.android.material:material:1.2.0-alpha06'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta6'
implementation 'androidx.preference:preference:1.1.1'
}
Alles anzeigen
Viele Grüße
R.
Hallo Zusammen,
wie kann man eigentlich mit dem "EditTextPreference" eine Passwort-Eingabe realisieren,
wo man die Eingabe-Rückmeldung über "*" oder ähnlich sichtbar machen kann.
<EditTextPreference
android:key="@string/key_Password"
app:defaultValue="@string/pref_Password"
app:key="@string/key_Password"
app:summary="@string/pref_Password"
app:title="@string/prefs_summary_category_Password"/>
Irgendwie finde ich da derzeit keine Lösung ?
Viele Grüße
R.
Hi,
wo findet man den ein komplettes Beispiel, was man vernünftig als Basis verwenden kann ?
Gibt es ein gutes Buch, was sowas auch anschaulich beschreibt.
Im Internet findet man ja eine Menge Beispiel, nur keines davon hilft mir derzeit wirklich.
Das Buch, welche ich habe "Android-Apps entwicklen" hört da an der Stelle auf. Ist vielleicht auch schon was in die Jahr gekommen.
Viele Grüße
R.
Hallo Zusammen,
ich beginne derzeit mit dem Einbinden meiner ersten "PreferenceFragment" und habe hierbei folgendes gemacht:
SettingsFragment.Java
package com.example.parkhilfeclient;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
Alles anzeigen
Aufruf in der Activity
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
return true;
}
Preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference android:name="EditText Preference"
android:summary="Geben Sie Ihren Kontonamen an"
android:defaultValue="@string/pref_Username"
android:title="Kontoname"
android:key="editTextAccountName" />
</PreferenceScreen>
Das Ergebnis ist verblüffend. Die Settings werden im aktuellem Fragment angezeigt. Es gibt keinen Back-Button.
Eigentlich sollte eine klassische "Settings" Seite dargestellt werden.
Was habe ich ihr falsch gemacht ?
Viele Grüße
R.
Hallo Thomas,
Kannst Du mal was von deinem Programm Posten?
Sprich wie lädst Du den mapView ?
Z.B:
mapView = findViewById(R.id.mapView); // Find the Map view in the resource file
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setMultiTouchControls(true);
Wie lädst Du den LocationManager ?
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, this);
Wie setzt Du einen Marker ?
startMarker = new Marker(mapView);
startMarker.setIcon(getResources().getDrawable(R.drawable.person,null));
startMarker.setTitle("Ich");
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
mapView.getOverlays().add(startMarker);
Settings in der AndroidManifest richtig gesetzt ?
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- DANGEROUS PERMISSIONS, must request -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Entsprechend auch die Permission im Programm abfragen.
So, jetzt bist Du am Zug.
Viele Grüße
R.
Hallo Jogimuc,
der ganze Umbau kam, weil ich in meine App eine Settings-Seite einbauen will.
Ohne Fragmente wurde dieser Balken nicht angezeigt,
Viele Grüße
R.
Hallo,
hier die Zeilen in der MainActivity, welche ich remarkt habe
public class MainActivity extends AppCompatActivity {
private static final int MY_PERMISSIONS_REQUEST_GPS_STATE = 1;
private static final int MY_PERMISSIONS_REQUEST_WRITE_SDCARD = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Toolbar toolbar = findViewById(R.id.toolbar);
// setSupportActionBar(toolbar);
Alles anzeigen
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<org.osmdroid.views.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tilesource="Mapnik">
</org.osmdroid.views.MapView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageButton
android:id="@+id/cmdCenterAuto"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/caricon"
android:visibility="visible" />
<ImageButton
android:id="@+id/cmdPerson"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/person"
android:visibility="visible" />
<ImageButton
android:id="@+id/cmdOverview"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/cardoverview"
android:visibility="visible" />
<ImageButton
android:id="@+id/cmdCarLocation"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/ic_menu_mylocation"
android:visibility="visible" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Alles anzeigen
diese Zeilen waren/sind in der Layout Datei der "activity_main.xml"
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Alles anzeigen
Hallo Jogimuc,
danke für die Tipps. Die Anwendung startet jetzt wieder. Ich habe die Permission auch in die MainActivity gesetzt.
Musste aber jetzt "@SuppressLint("MissingPermission")" in das Fragment einfügen. Ist das normal ?
Ansonsten startet die App wieder und zeigt auch wieder Daten auf dem Bildschirm an.
Derzeit stört mich nur noch, das ich plötzlich eine zweiten Bereich der Actionbar habe, den ich nicht verwende.
Hier wird derzeit ein "grauer" Balken angezeigt. Mal sehen ob ich das auch noch finde.
Gefunden, das hier war wohl durch das ganze Probieren zu viel in der Datei "activity_main.xml"
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
Alles anzeigen
Viele Grüße
R.
Scheinen doch noch andere Probleme im Zusammenhang mit dem Layout zu sein.
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener"
mapView = getView().findViewById(R.id.mapView); // Find the Map view in the resource file
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setMultiTouchControls(true);
Ich bekomme für "mapView" einen Null-Pointer zurück. Daher "knallt" es.
Vielen Dank für den Tip mit dem Layout. Das hat mich wieder in die Situation gebracht, den Debugger zu verwenden.
Viele Grüße
R.