Methoden Erklärung/Dokumentation

  • Antworten:26
Johannes Schaffer
  • Forum-Beiträge: 36

07.06.2018, 21:25:58 via Website

Liebe Community
Wo kann ich nachschauen, was bestimmte Methoden bedeuten. Ich habe mir z.b. einen Quelltext für eine Android-Taschenlampe im Internet angeguckt, und möchte ihn gerne verstehen. In dem Quelltext kommen folgende Zeilen:

final boolean hasCameraFlash = getPackageManager().
hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
boolean isEnabled = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)

Nun weiß ich nicht was die Methode "getPackageManager" macht. Dazu habe ich im Internet und auf developer.android.com gesucht. Habe aber leider keine Erklärungg gefunden. Würde mir eine Erklärung wie "liest die Berechtigungen der App aus" z.b. wünschen.

Mit freundlichen Grüßen
Johannes

Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.06.2018, 08:40:56 via App

Hallo Johannes,
Die Dokumentation solltest du eigentlich finden:
https://developer.android.com/reference/android/content/Context#getPackageManager()

Und in AndroidStudio kannst du eigentlich per MoiseOver dir die Doc anzeigen lassen, wenn das so eingestellt ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Ludy
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

09.06.2018, 13:18:07 via Website

Vielen Dank erstmal für die schnelle Antwort. Auf dieser Seite war ich ja, wie oben beschrieben, schon. Dort kann ich aber keine Erklärung finden, was diese Methode macht. Sehe dort nur wie man sie aufruft und was bestimmte Parameter bedeuten ( wenn ich das richtig verstanden habe; bin nicht sehr gut in Englisch;))

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.957

09.06.2018, 13:36:42 via Website

Hallo Johannes,

#getPackageManager gibt die Instanz zurück, um die globalen Paketinformationen zu nutzen.

Diese sind hier aufgelistet.

Mit der Methode #hasSystemFeature wird abgefragt ob das System, wo die App läuft, existent ist.

In deinem Beispiel PackageManager.FEATURE_CAMERA_FLASH - hier handelt es sich darum ob das Handy Blitzlicht unterstützt.

Und das habe ich nur aus der Dokumentation gelesen - mein englisch ist auch nicht gut, aber dafür kann man den Link verwenden https://translate.google.de/#en/de/

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

09.06.2018, 15:10:34 via Website

Vielen Dank. Das konnte ich da nicht rauslesen. Könntest du mir vielleicht ein zwei Zeilen von dieser Seite (also original) kopieren, damit ich das auch finden kann? Währe echt nett:)
LG Johannes

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.957

10.06.2018, 08:45:05 via Website

Na klar:

#getPackageManager()

added in API level 1
public abstract PackageManager getPackageManager ()
Return PackageManager instance to find global package information.

#hasSystemFeature(String)

added in API level 5
Returns true if the devices supports the feature, else false.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Johannes SchafferPascal P.
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 11:50:16 via Website

Vielen Dank. Das mit dem hasSystemFeature finde ich. Das mit dem getPackageManager nicht. Ich finden zwar das: FEATURE_CAMERA_FLASH
added in API level 7
public static final String FEATURE_CAMERA_FLASH
Feature for getSystemAvailableFeatures() and hasSystemFeature(String): The device's camera supports flash.

Constant Value: "android.hardware.camera.flash"

Aber da steht, dass FEATURE_CAMERA_FLASH eine Methode für getSystemAvailableFeatures() und hasSystemFeature(String) ist. Bei mir steht aber getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH).

Also zum einen würde ich der Dokumentation entnehemen, das ich hasSystemFeuture() ohne getPackageManager() aufrufen kann, und zum anderen, finde ich auf der Seite deine Definition von getPackageManager() nicht.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 12:14:53 via Website

Hat sich schon erledigt. Habe alles gefunden. Eine Frage habe ich trotzdem noch. Wenn getPackageManager() eine Methode ist, wieso ruf ich dann hasSystemFeuture() mit einem Punkt nach getPackagManager() auf; also:
getPackageManager().hasSystemFeature() ? Müsste getPackageManager() dann nicht ein Objekt sein?
Oder ist hasSystemFeature() sowas wie eine Untermethode von getPackageManager() ?

LG Johannes

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.957

10.06.2018, 12:59:22 via Website

So einfach lässt sich das nicht erklären, aber ich probiere es dennoch - ohne Gewähr :-)

#getPackageManager ist eine Methode in der Context Klasse welche von Object erbt.

In #getPackageManager wird die abstract Klasse PackageManager (erbt von Object) aufgerufen und ggf. initialisiert. Da ein this - als das Object - zurückgegeben wird, kann eine Kettenmethode verwendet werden.

Um das genauer zu beschreiben, würde der Aufwand den nutzen übersteigen.
Einfach gesagt die Verkettung kommt durch das return des Objects.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.06.2018, 13:02:47 via Website

Hallo Johannes,

getPackageManager()

gibt dir ein PackageManager Objekt zurück.
Darauf kannst du dann hasSystemFeature() aufrufen, da diese Methode im PackageManager definiert ist.

Alternativ:

PackageManager manager = getPackageManager();
boolean hasFeature = manager.hasSystemFeature();

Da du da aber immer mehr Zeilen Code brauchst, und die die Zwischenvariablen nicht verwendest, ist die Kurzschreibweise davon: getPackageManager().hasSystemFeature()
da du auf ein PackageManager das System Feature aufrufen kannst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Ludy
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 13:37:23 via Website

Vielen Dank euch beiden! Also könnte ich auch PackageManager manager = new PackageManager(); statt PackageManager manager = getPackageManager(); bentzen, schließe ich daraus. War nur verwirrt weil in der Doku als return von getPackageManager "PackageManager" steht. ich wusste nicht das damit ein Obkect gemeint ist. Denke jetzt habe ich es verstanden. Also vielen Dank!

Mit freundlichen Grüßen
Johannes Schaffer

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.957

10.06.2018, 16:18:36 via App

Das würde keine logische Sache sein, denn du benötigst den Context, dieser wäre wieder zu übergeben und dann wärest du wieder bei einem aufgeblähten Code.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 17:12:38 via Website

Wie würde keine logische Sache sein?

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

10.06.2018, 18:10:34 via Website

Hallo

Also könnte ich auch PackageManager manager = new PackageManager(); statt PackageManager manager = getPackageManager(); bentzen, schließe ich daraus.

Stimmt nicht ganz.
Mit "getPackageManager()" bekommst du den Manager der im Momet aktiv ist.
Mit "new PackageManager()" wird ein neuer erstellt, ein neues Objekt.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 18:20:04 via Website

Okay und wie soll ich das verstehen? Wie kann der denn schon Informationen speichern, wenn noch gar kein Objekt von ihm existiert?

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 21:24:34 via Website

Damit man einen PackageManager benutzen kann, der schon Informationen gespeichert hat, müsste doch schon ein Objekt von ihm existieren, welches dieses Informationen speichert, oder?

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

10.06.2018, 21:40:32 via Website

Ja genau.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 22:04:55 via Website

Dieses existiert aber nicht. Hier mal der ganze Code

package com.example.johannes.taschenlampe2;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.johannes.taschenlampe2.R;

public class MainActivity extends AppCompatActivity {

private Button buttonEnable;
private ImageView imageFlashlight;
private static final int CAMERA_REQUEST = 50;
private boolean flashLightStatus = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageFlashlight = (ImageView) findViewById(R.id.imageFlashlight);
    buttonEnable = (Button) findViewById(R.id.buttonEnable);

    final boolean hasCameraFlash = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    boolean isEnabled = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;


    buttonEnable.setEnabled(!isEnabled);
    imageFlashlight.setEnabled(isEnabled);
    buttonEnable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA}, CAMERA_REQUEST);
        }
    });

    imageFlashlight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (hasCameraFlash) {
                if (flashLightStatus)
                    flashLightOff();
                else
                    flashLightOn();
            } else {
                Toast.makeText(MainActivity.this, "No flash available on your device",
                        Toast.LENGTH_SHORT).show();
            }
        }
    });
}

private void flashLightOn() {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

    try {
        String cameraId = cameraManager.getCameraIdList()[0];
        cameraManager.setTorchMode(cameraId, true);
        flashLightStatus = true;
        imageFlashlight.setImageResource(R.drawable.btn_switch_on);
    } catch (CameraAccessException e) {
    }
}

private void flashLightOff() {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

    try {
        String cameraId = cameraManager.getCameraIdList()[0];
        cameraManager.setTorchMode(cameraId, false);
        flashLightStatus = false;
        imageFlashlight.setImageResource(R.drawable.btn_switch_off);
    } catch (CameraAccessException e) {
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch(requestCode) {
        case CAMERA_REQUEST :
            if (grantResults.length > 0  &&  grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                buttonEnable.setEnabled(false);
                buttonEnable.setText("Camera Enabled");
                imageFlashlight.setEnabled(true);
            } else {
                Toast.makeText(MainActivity.this, "Permission Denied for the Camera", Toast.LENGTH_SHORT).show();
            }
            break;
    }
}

}

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

10.06.2018, 22:13:37 via Website

Hi
ich habe nicht gesagt das die schon existirt. Sondern nur das es nicht das geiche ist "getPackageManager()" und "new PackageManager()" .

Also könnte ich auch PackageManager manager = new PackageManager(); statt PackageManager manager = getPackageManager(); bentzen, schließe ich daraus.

und das stimmt eben so nicht.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

10.06.2018, 22:16:18 via Website

Okay könntest du mir dann sagen wie dieser packagemanager schon Informationen speichern konnte die der neue packagemanager dann nicht hat?

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

11.06.2018, 09:48:26 via Website

Hi ich verstehe nicht so richtig was du willst wo dein Problem ist.
Eigentlich müsste jede app activity einen packetmanager haben.
Denn activity erbt zumindesten indirekt von context. Und hat somit einen packetmanager, in den am Anfang beim Aufbau der Aktivität die Daten gespeichert werden.
Wie gesagt kann ich nicht nachvollziehen worum es dir geht. Wo in dem Code hast du ein Problem?

Ein neue Instanz von einem Manager ist lehr.

Beim Aufbau der activity werden viele Objekte Instanzen erstellt und system werte in ihnen gespeichert oder es wird auf die System Instanzen zugegriffen.

Um zu erfahren ob dein Handy ein Blitz hat braucht du die Instanz des pacetmanager vom System oder der activity, weiss ich jetzt nicht genau, den du nun mit getpacetmanager bekommst.

Mir war erst mal wichtig das du verstehst das get... und new packet.... Nicht das selbe ist.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

11.06.2018, 10:58:03 via Website

Okay und wie soll ich das verstehen? Wie kann der denn schon Informationen speichern, wenn noch gar kein Objekt von ihm existiert?

Das Objekt besteht ja schon wird vom System oder der activity erstellt.
Mit dem get.... holst du die Instanz ( Objekt) von System. Und speicherst sie in einer variablen oder greifst gleich darauf zu.

this.getPackageManager() gibt dir doch das Objekt zurück.
Es sucht so zu sagen im System die Instanz und gibt sie dir.

Was nützt dir ein lehres neues Objekt. Du willst das System objekt haben in dem die Eigenschaften die Hardware des Handys gespeichert sind.

Hoffe das es nun klar geworden ist.
LG J.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

11.06.2018, 17:40:46 via Website

Ja, vielen Dank. Ich wusste nicht, dass die Activity schon ein PacketManager-Objekt angelegt hat.
Wo steht denn dieses Object? Also wo ist der Code in dem es angelegt wird? Dieser Code ist ja in der MainActivity nicht zu sehen.
LG Johannes

— geändert am 11.06.2018, 17:45:56

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

11.06.2018, 18:02:23 via Website

Das sind alles Sachen die beim erstellen und erben von Activity gemacht werden. Das kannst du nicht nachschauen.

Wo der Code steht in der Klasse Activity dazu müsstest du dir den Quell Code von Android anschauen.

— geändert am 11.06.2018, 18:05:10

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

11.06.2018, 18:06:37 via Website

Achso okay. Dachte das müsste trotzdem irgendwo in meinem Programm stehen, da Android das Programm ja nicht ausführt, sondern die Java-VirtualBox.
MfG Johannes

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

11.06.2018, 21:08:10 via Website

Hi
Frage wo läuft deiner Meinung nach das Android framework?
Was ist für dich Android?

Android besteht aus mehreren Teilen. Dem Kernel, dem HAL, nativen Bibliotheken, der Java Maschine, dem Java android framework.
Dieses framework läuft in der java Maschine. Deine app wir in byte Code übersetzt und läuft auch in der Java Maschine.
Der Launcher der auch zum framework gehört startet deine app.
Somit wird deine app von Android ausgeführt.

Hilfreich?
Kommentieren
Johannes Schaffer
  • Forum-Beiträge: 36

11.06.2018, 21:56:00 via Website

Okay vielen vielen Dank für deine Hilfe. Denke ich habe jetzt alles verstanden;)
Noch eine schönen Abend dir.
MfG Johannes

Hilfreich?
Kommentieren