Methoden Erklärung/Dokumentation

  • Antworten:26
  • OffenNicht stickyNicht beantwortet
  • 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

Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.168

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.158

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
  • 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?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.158

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.158

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.168

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.158

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • Forum-Beiträge: 483

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?
Diskutiere mit!
  • 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?
Diskutiere mit!

Empfohlene Artikel