Permission Abfrage funktioniert nicht mehr

  • Antworten:34
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 44

16.01.2017, 13:24:15 via Website

Hallo Zusammen,
ich habe kürzlich zu meiner App einen Login hinzugefügt.
Funktioniert alles Top, jedoch ist nun mein Problem, dass sich nun die zuerst ausführende Activity von MainActivity auf LoginActivity geändert hat. Die Permission Abfrage ist jedoch in der MainActivity, das führt dazu, dass jeder Aufruf meiner Map scheitert, da ich ja keine Berechtigungen habe. Hat jemand eine Idee, wie die Abfrage wieder funktioniert und ich nicht immer händisch die Berechtigungen gewähren muss?
Schöne Grüße
Dominik

Antworten
  • Forum-Beiträge: 2.907

16.01.2017, 13:25:19 via Website

Hallo Dominik,

welche Permission meinst du denn ??
Und wie hast du sie realisiert ?

— geändert am 16.01.2017, 13:25:45

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

16.01.2017, 21:10:02 via Website

Hallo Stefan,

ich meine eine Standort Berechtigung, sodass sie auf einer Karte angezeigt werden kann.
Die Permission hat bevor ich den Login hinzugefügt habe super funktioniert, jedoch jetzt leider nicht mehr.
Also ich meine damit, dass sie nicht mehr automatisch erscheint, sondern ich die Berechtigungen manuell (in den settings) definieren muss.
Ich habe sie wie folgt realisiert:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback{

private TextView txtName;
private TextView txtEmail;
private Button btnLogout;

private SQLiteHandler db;
private SessionManager session;
private String[] mPlanetTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private GoogleMap googleMap;

SupportMapFragment sMapfragment;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sMapfragment = SupportMapFragment.newInstance();




    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener((NavigationView.OnNavigationItemSelectedListener) this);
    sMapfragment.getMapAsync((OnMapReadyCallback) this);

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) this, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
            alertBuilder.setCancelable(false);
            alertBuilder.setTitle("Permission necessary");
            alertBuilder.setMessage("Fine Location is necessary");
            alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1234);
                }
            });

            AlertDialog alert = alertBuilder.create();
            alert.show();
        } else {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1234);
        }

    }


    // SqLite database handler
    db = new SQLiteHandler(getApplicationContext());

    // session manager
    session = new SessionManager(getApplicationContext());

    if (!session.isLoggedIn()) {
        logoutUser();
    }

    // Fetching user details from sqlite




    // Displaying the user details on the screen

          // Logout button click event


}

/**
 * Logging out the user. Will set isLoggedIn flag to false in shared
 * preferences Clears the user data from sqlite users table
 * */
private void logoutUser() {
    session.setLogin(false);

    db.deleteUsers();

    // Launching the login activity
    Intent intent = new Intent(MainActivity.this, LoginActivity.class);
    startActivity(intent);
    finish();
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();


    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    android.support.v4.app.FragmentManager sFm = getSupportFragmentManager();
    int id = item.getItemId();

    if (sMapfragment.isAdded())
        sFm.beginTransaction().hide(sMapfragment).commit();
    if (id == R.id.nav_map) {
        if (!sMapfragment.isAdded())

            sFm.beginTransaction().add(R.id.penats, sMapfragment).commit();
        else
            sFm.beginTransaction().show(sMapfragment).commit();

    } else if (id == R.id.nav_locations) {

    } else if (id == R.id.nav_events) {

    } else if (id == R.id.nav_calendar) {

    } else if (id == R.id.nav_chat) {

    } else if (id == R.id.nav_ranking) {

    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@SuppressWarnings("MissingPermission")
@Override
   public void onMapReady(GoogleMap googleMap) {

    googleMap.setMyLocationEnabled(true);
}

}

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 03:11:10 via Website

Hallo Dominik,

den Fall hatte ich noch nicht , weil ich die Permission - Abfrage immer in die Activity setze,
die auch in der Manifest mit Intent MAIN/LAUNCHER angegeben wurde.

Ich meine mal mich ganz dunkel zu erinnern , dass das bei mir auch mal vorkam.

Setze mal die Permission um , es ist ja im Prinzip wurscht, ob sie in der LoginActivity abgefragt wird.
Sie ist eh erst mal im Vordergrund und das nur einmal

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

17.01.2017, 09:03:31 via Website

Hallo Stefan,

habe nun folgendes in die LoginActivity gesetzt hilft leider nichts:

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) this, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
        alertBuilder.setCancelable(false);
        alertBuilder.setTitle("Permission necessary");
        alertBuilder.setMessage("Fine Location is necessary");
        alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            public void onClick(DialogInterface dialog, int which) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1234);
            }
        });

        AlertDialog alert = alertBuilder.create();
        alert.show();
    } else {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1234);
    }

}

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 09:09:41 via Website

Nimm mal die einfache Variante

    if (ContextCompat.checkSelfPermission(mActivity,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity,Manifest.permission.READ_EXTERNAL_STORAGE))
        {
        }
        else
        {
         ActivityCompat.requestPermissions(mActivity,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},23142);
        }
    }

— geändert am 17.01.2017, 09:10:20

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.177

17.01.2017, 09:34:35 via App

Mir fehlt da irgendwie der Callback.
Wo springt er rein wenn Permission erlaubt??

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

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 10:09:32 via Website

Meinst du mich oder Ihn Pascal ?

Bei mir fehlt er , es ging mir erst mal darum , dass er überhaupt was angezeigt bekommt

Dann kommt das Nächste :-)

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults)

— geändert am 17.01.2017, 10:11:14

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

17.01.2017, 10:30:41 via Website

Hallo Zusammen,

@Stefan, soll ich die reduzierte Variante in die LoginActivity oder in die MainActivity schreiben?

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 10:34:12 via Website

In der Zeit wo du das gefragt hast hättest du schon zweimal ein Paste & Copy gemacht :-)

P.S aber vorher die Berechtigungen wieder manuell entziehen - ggf apk deinstallieren

— geändert am 17.01.2017, 10:34:56

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

17.01.2017, 18:57:39 via Website

Hallo Zusammen,

egal, ob ich es in die Login oder Main Activity schreibe, wird mir die Activity, sowie folgendes rot angezeigt: READ_EXTERNAL_STORAGE

Antworten
  • Forum-Beiträge: 44

17.01.2017, 19:42:55 via Website

@Stefan, du hast erwähnt, dass immer deine MainActivity auch die StartActivity war. Aber wie realisierst du dann einen Login? Weil der muss ja die StartActivity sein oder nicht?

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 21:48:24 via Website

Hallo Dominik,

Stefan, du hast erwähnt, dass immer deine MainActivity auch die StartActivity war. Aber wie realisierst du dann einen Login? Weil der muss ja die StartActivity sein oder nicht?

Das habe ich nicht geschrieben , immer die Activity (Name egal) , die in der Manifest mit MAIN/LAUCHER Intent angegeben ist die Activity, die beim Start benutzt wird.

Wenn du also dort deine Permissions einsetzt , wird es auch gehen .

egal, ob ich es in die Login oder Main Activity schreibe, wird mir die Activity, sowie folgendes rot angezeigt: READ_EXTERNAL_STORAGE

Das war nur ein Beispiel, wenn du READ_EXTERNAL_STORAGE nimmst , so sollte das auch in der Manifest sein

< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
< uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Schau mal genau , was dir AS dann schreibt , wenn du complierst oder vorher mit der Maus drüber gehst , da steht das dann auch.
(Ausserdem auf der rechten Seite auch ( bei den vielen kleinen roten strichen )

— geändert am 17.01.2017, 21:52:39

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

17.01.2017, 22:32:09 via Website

Hallo Stefan,

Das habe ich nicht geschrieben , immer die Activity (Name egal) , die in der Manifest mit MAIN/LAUCHER Intent angegeben ist die Activity, die beim Start benutzt wird.
Wenn du also dort deine Permissions einsetzt , wird es auch gehen .

Bei mir ist die Start Activity die LoginActivity
Ich habe die Permission Geschichten in die LoginActivity geschrieben --> funktioniert leider nicht
Kann es daran liegen, dass meine Map keine eigene Activity ist, sondern nur ein SmapFragment?

Antworten
  • Forum-Beiträge: 2.907

17.01.2017, 22:55:18 via Website

ass meine Map keine eigene Activity ist, sondern nur ein SmapFragment

Späte Info , auch ne Info ... :-(
(Bitte komplette info , wenn du Hilfe benötigst - unsere Kristallkugel hat auch nur eine beschränkte Kapazität)

Oben hast du aber die ganze Zeit von Activites gesprochen :-)

Du solltest schon eine Activity verwenden ...

— geändert am 17.01.2017, 22:56:43

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

18.01.2017, 08:49:40 via Website

Hallo Stefan,

sorry, aber ich dachte, dass dies klar ist. Ich werde es mit einer Activity versuchen.
Ich gebe euch dann bescheid.
Schöne Grüße
Dominik

Antworten
  • Forum-Beiträge: 44

18.01.2017, 20:47:16 via Website

Hallo Zusammen,

ich verzweifle gerade :(.
Mein Projekt ist ja wie vorher erwähnt ein Navigation Drawer Activity. Nun versuche ich eine Google Maps Activity hinzuzufügen, aber nun wird mir folgendes immer rot Markiert:

 MapFragment  test= new MapFragment();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.relativelayout_for_fragment, test,test.getTag()).commit();

und zwar wird das getTag rot markiert und ich kann nur eine Methode einfügen, jedoch weiss ich nicht was da rein soll.

Antworten
  • Forum-Beiträge: 44

18.01.2017, 20:51:01 via Website

das getTag funktioniert nur wenn ich es als normales Fragment hinzufüge, aber dann kann ich dies nicht als Map verwenden. Weiss jemand, wie ich die Navigation Codieren muss bzw die Map Class

Antworten
  • Forum-Beiträge: 2.907

18.01.2017, 21:08:20 via Website

Hallo Dominik ,

dein Konzept muss schon an die API angelehnt sein.

Eigentlich gibt es X Richtlinien-Beschreibungen dazu ...

Durcharbeiten musst du dich schon selbst ...
http://www.vogella.com/tutorials/AndroidGoogleMaps/article.html
https://developers.google.com/maps/get-started/?hl=de

Tante Google ist voll von Beispielen
.
.

wie ich die Navigation Codieren muss

Navigation ?? das Map-API kann nicht Navigieren

.
.

P.S es wäre schön , wenn wir auch mal von dir eine Rückmeldung auf die Permissions hätten,
wenn wir uns schon die Mühe machen

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 44

18.01.2017, 21:22:57 via Website

Hallo Stefan,

ich habe vorhin ja geschrieben, dass ich das SmapFragment in eine eigene Activity umziehen möchte, da stellt sich auch mein Problem dar, dass ich nicht weiss, wie ich in einem Navigation Drawer zu einer Activity navigieren kann .

Antworten

Empfohlene Artikel