[GELÖST] Problem mit meiner Check Permission Methode

Micka

Micka

Fortgeschrittenes Mitglied
1
Hallo,
ich habe aktuell ein Problem mit meiner Check Permission Methode. Das komische ist das genau diese Methode in einer anderen App funktioniert. Habe sie von dort kopiert.

Mein Problem ist, dass der Dialog indem ich die Permission bestätige oder ablehne nicht erscheint. Das Ergebnis ist immer Permission Denied.Ich kriege den AlertDialog angezeigt indem erklärt wird wofür die Permission bentötigt wird, aber keinen Dialog um die Permission zu erteilen oder abzulehnen.

Ich poste einfach mal die Methode.

Code:
public void checkPermissions()
    {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Zugriff auf den externen Speicher wird benötigt um die Ergebnisse in eine Datei schreiben zu können.").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id)
                {
                    //do things
                    ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
                    Log.i("GERDING", "REQUEST PERMISSION");
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }

Das Ergebnis fange ich mit der folgenden Methode ab.

Code:
@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    {
        switch (requestCode)
        {
            case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
            {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    // permission was granted, yay! Do the
                    // task you need to do.
                    Log.i("GERDING", "PERMISSION GRANTED");
                }else
                {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Log.i("GERDING", "PERMISSION DENIED");
                    this.finish();
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }


Sieht jemand wo das Problem liegt? Ich schätze es ist irgendwas kleines das ich vergessen habe ebenfalls zu kopieren.

Hier nochmal der Code der gesamten Activity.
Code:
package de.gerding.test.dbperformancemessung;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import de.gerding.test.dbperformancemessung.Diagramme.ShowSizeGraphActivity;
import de.gerding.test.dbperformancemessung.Diagramme.ShowTimeGraphActivity;

public class MainActivity extends Activity implements View.OnClickListener
{
    //View Elemente
    private Button button_mainactivity_start_evaluation,button_mainactivity_show_ergebniise,button_mainactivity_show_timegraph,button_mainactivity_show_sizegraph;
    private TextView textview_mainactivity_state_display;

    //Debug Parameter
    public static boolean logging = true;

    //Ergebnisse
    private long[] couchdurations = null; //= new long[]{134,56,396,970,1943};
    private long[] couchsizes = null;
    private long[] perstdurations = null; //= new long[]{38, 283, 546, 1445,2719};
    private long[] perstsizes = null;
    private long[] sqlitedurations = null; //= new long[]{60,447,4538,11523,19981};
    private long[] sqlitesizes = null;


    //Sonstige Variablen
    private Context ctx;
    private int progressstate = 0;
    private final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1001;
    private Activity thisActivity;

    //Servicezeugs
    public static String ServiceResponseTag = "ServiceResponse";
    public static final String CouchTimesTag = "couchtimes";
    public static final String CouchSizesTag = "couchsizes";
    public static final String PerstTimesTag = "persttimes";
    public static final String PerstSizesTag = "perstsizes";
    public static final String SQLiteTimesTag = "sqlitetimes";
    public static final String SQLiteSizesTag = "sqlitesizes";
    private ResponseReceiver responsereceiver;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        thisActivity = this;
        button_mainactivity_start_evaluation = (Button) findViewById(R.id.button_mainactivity_start_evaluation);
        button_mainactivity_start_evaluation.setOnClickListener(this);
        button_mainactivity_show_ergebniise = (Button) findViewById(R.id.button_mainactivity_show_ergebnisse);
        button_mainactivity_show_ergebniise.setOnClickListener(this);
        button_mainactivity_show_timegraph = (Button) findViewById(R.id.button_mainactivity_show_timediagram);
        button_mainactivity_show_timegraph.setEnabled(false);
        button_mainactivity_show_timegraph.setOnClickListener(this);
        button_mainactivity_show_sizegraph = (Button) findViewById(R.id.button_mainactivity_show_dbsizediagram);
        button_mainactivity_show_sizegraph.setEnabled(false);
        button_mainactivity_show_sizegraph.setOnClickListener(this);
        ctx = this;
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        checkPermissions();
    }
    @Override
    public void onClick(View v)
    {
        log("Gerding", "onClick(View v");
        Intent intent;
        switch (v.getId())
        {
            case R.id.button_mainactivity_start_evaluation:
                log("Gerding", "Start Evaluation");
                intent = new Intent(this, EvaluationService.class);
                this.startService(intent);
                //ergebnisArraysInitialisieren();
                progressstate = 0;
                progressDialog  = new ProgressDialog(ctx);
                progressDialog.setMax(28);
                progressDialog.setProgress(0);
                progressDialog.setTitle("Evaluation läuft");
                progressDialog.setMessage("Evaluation wurde gestartet");
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setCancelable(false);
                progressDialog.show();
                button_mainactivity_show_timegraph.setEnabled(false);
                button_mainactivity_show_sizegraph.setEnabled(false);
                //initData();
                break;
            case R.id.button_mainactivity_show_timediagram:
                log("Gerding", "Show TimeGraph");
                if((couchdurations != null) && (perstdurations != null) && (sqlitedurations != null))
                {
                    intent = new Intent(this, ShowTimeGraphActivity.class);
                    intent.putExtra(MainActivity.CouchTimesTag, couchdurations);
                    intent.putExtra(MainActivity.PerstTimesTag, perstdurations);
                    intent.putExtra(MainActivity.SQLiteTimesTag, sqlitedurations);
                    startActivity(intent);
                }else
                {
                    Toast.makeText(ctx, "Es muss erst evaluiert werden", Toast.LENGTH_LONG).show();
                }
                break;
            case R.id.button_mainactivity_show_dbsizediagram:
                if((couchdurations != null) && (perstdurations != null) && (sqlitedurations != null))
                {
                    intent = new Intent(this, ShowSizeGraphActivity.class);
                    intent.putExtra(MainActivity.CouchSizesTag, couchsizes);
                    intent.putExtra(MainActivity.PerstSizesTag, perstsizes);
                    intent.putExtra(MainActivity.SQLiteSizesTag, sqlitesizes);
                    startActivity(intent);
                }else
                {
                    Toast.makeText(ctx, "Es muss erst evaluiert werden", Toast.LENGTH_LONG).show();
                }
                break;
            case R.id.button_mainactivity_show_ergebnisse:
                intent = new Intent(this, ErgebnisActivity.class);
                intent.putExtra(MainActivity.CouchTimesTag, couchdurations);
                intent.putExtra(MainActivity.CouchSizesTag, couchsizes);
                intent.putExtra(MainActivity.PerstTimesTag, perstdurations);
                intent.putExtra(MainActivity.PerstSizesTag, perstsizes);
                intent.putExtra(MainActivity.SQLiteTimesTag, sqlitedurations);
                intent.putExtra(MainActivity.SQLiteSizesTag, sqlitesizes);
                startActivity(intent);
        }
    }
    public class ResponseReceiver extends BroadcastReceiver
    {
        public static final String ACTION_RESP = "de.gerding.intent.action.serviceanswer";
        @Override
        public void onReceive(Context context, Intent intent)
        {
            if(intent.getStringExtra(ServiceResponseTag).equalsIgnoreCase("State"))
            {
                progressstate ++;
                if(progressDialog.isShowing())
                {
                    progressDialog.setMessage(intent.getStringExtra("State"));
                    progressDialog.setProgress(progressstate);
                }
                log("Gerding", "new State:  " + intent.getStringExtra("State"));
            }else if(intent.getStringExtra(ServiceResponseTag).equalsIgnoreCase("ENDE"))
            {
                if(progressDialog.isShowing())
                {
                    progressDialog.dismiss();
                }
                button_mainactivity_show_timegraph.setEnabled(true);
                button_mainactivity_show_sizegraph.setEnabled(true);
                couchdurations = intent.getLongArrayExtra(MainActivity.CouchTimesTag);
                couchsizes = intent.getLongArrayExtra(MainActivity.CouchSizesTag);
                perstdurations = intent.getLongArrayExtra(MainActivity.PerstTimesTag);
                perstsizes = intent.getLongArrayExtra(MainActivity.PerstSizesTag);
                sqlitedurations = intent.getLongArrayExtra(MainActivity.SQLiteTimesTag);
                sqlitesizes = intent.getLongArrayExtra(MainActivity.SQLiteSizesTag);

                new writeToFileTask().execute();

                intent = new Intent(ctx, ErgebnisActivity.class);
                intent.putExtra(MainActivity.CouchTimesTag, couchdurations);
                intent.putExtra(MainActivity.CouchSizesTag, couchsizes);
                intent.putExtra(MainActivity.PerstTimesTag, perstdurations);
                intent.putExtra(MainActivity.PerstSizesTag, perstsizes);
                intent.putExtra(MainActivity.SQLiteTimesTag, sqlitedurations);
                intent.putExtra(MainActivity.SQLiteSizesTag, sqlitesizes);
                startActivity(intent);
            }
        }
    }
    @Override
    protected void onPause()
    {
        super.onPause();
        unregisterReceiver(responsereceiver);
    }
    @Override
    protected void onStop()
    {
        super.onStop();
    }
    @Override
    protected void onResume()
    {
        super.onResume();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        responsereceiver = new ResponseReceiver();
        registerReceiver(responsereceiver, filter);
    }
    public static void log(String logTag, String logtext)
    {
        if(logging)
        {
            Log.i(logTag, logtext);
        }
    }
    private class writeToFileTask extends AsyncTask<String, Integer, Long>
    {
        protected Long doInBackground(String... params)
        {
            Log.i("Gerding", "Filewrite is started");

            //Write File
            String state;
            File file;
            state = Environment.getExternalStorageState();
            if(Environment.MEDIA_MOUNTED.equals(state))
            {
                File Root = Environment.getExternalStorageDirectory();
                File Dir = new File(Root.getAbsolutePath()+"/DBEvaluation");
                if(!Dir.exists())
                {
                    Dir.mkdir();
                }
                //Datetime
                Date date = new Date();
                SimpleDateFormat simpleDate = new SimpleDateFormat("dd_MM_yy_HH_mm_ss");
                String filename = simpleDate.format(date);
                file = new File(Dir, filename + ".txt");
                FileOutputStream fos = null;
                String zeile = "";
                long[] datasizes = new long[]{
                        10000,
                        10000,
                        10000,
                        10000,
                        10000,
                        1000,
                        10000,
                        100000};
                try {
                    fos = new FileOutputStream(file);
                    zeile = "Fahrt\tDatensätze\tCouchbase\tPerst\tSQLite\n";
                    fos.write(zeile.getBytes());
                    for(int i = 0; i < 8; i++)
                    {
                        zeile = (i+1) + "\t" + datasizes[i]+ "\t" + couchdurations[0] + "\t" + perstdurations[0] + "\t" + sqlitedurations[i] + "\n";
                        fos.write(zeile.getBytes());
                    }
                    zeile = "\n\n";
                    fos.write(zeile.getBytes());
                    zeile = "Fahrt\tDatensätze\tCouchbase\tPerst\tSQLite\n";
                    fos.write(zeile.getBytes());
                    for(int i = 0; i < 8; i++)
                    {
                        zeile = (i+1) + "\t" + datasizes[i]+ "\t" + couchsizes[0] + "\t" + perstsizes[0] + "\t" + sqlitesizes[i] + "\n";
                        fos.write(zeile.getBytes());
                    }
                } catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }else
            {
                //ERROR
            }
            Log.i("Gerding", "Filewrite is finished");
            return 0l;
        }
    }
    public void checkPermissions()
    {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Zugriff auf den externen Speicher wird benötigt um die Ergebnisse in eine Datei schreiben zu können.").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id)
                {
                    //do things
                    ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
                    Log.i("GERDING", "REQUEST PERMISSION");
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    {
        switch (requestCode)
        {
            case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
            {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    // permission was granted, yay! Do the
                    // task you need to do.
                    Log.i("GERDING", "PERMISSION GRANTED");
                }else
                {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Log.i("GERDING", "PERMISSION DENIED");
                    this.finish();
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
}
 
Ich versuche mal es mit Screenshots deutlicher zu erlären. Im Ersten Bild wird die Erklärung angezeigt wofür die Berechtigung benötigt wird.
Screenshot_2016-05-19-16-28-07.png
Das klappt auch. Im zweiten Bild(sind aus einer anderen App) sieht man den Dialog der mir leider fehlt.
Screenshot_2016-05-19-16-28-11.png
 
Welche Android Version läuft auf Deinem Device?
 
Ein LG G4 mit Android 6.0
 
6cdf83651f0a17f531a60cc6e0b11852.jpg
 
Hier noch das Android Manifest:
c50b99361c84dc4af7812150205e5b40.jpg
 
Und die build.gradle:
6b432fe3ac79729983c38684042bc07e.jpg
 
Habe nach wie vor keine Lösung gefunden. Hat noch jemand eine Idee?
 
Juhu. Habe Das Problem nun lösen können.
Nachdem ich mir Declaring Permissions | Android Developers angesehen habe habe ich die <uses-permission> Tags verschoben. Vorher waren sie innerhalb der Application Tags. Jetzt sind die als erstes direkt nach dem <manifest...>
Und plötzlich klappts. Habe es nochmal zurückgeändert um das zu prüfen, aber dann klappts bei der App Definitiv nicht. Nun Frage ich mich warum das so ist, denn in einer anderen APP funktionier es obwohl die <uses-permissions> Tags innerhalb der <application> tags stehen.
Aber erstmal bin ich froh eine Lösung gefunden zu haben.
Das Manifest sieht nun wie folgt aus.
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.gerding.test.dbperformancemessung">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="de.gerding.test.dbperformancemessung.MainActivity"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="de.gerding.test.dbperformancemessung.Diagramme.ShowTimeGraphActivity" />
        <activity android:name="de.gerding.test.dbperformancemessung.Diagramme.ShowSizeGraphActivity" />
        <activity android:name="de.gerding.test.dbperformancemessung.ErgebnisActivity" />
        <service
            android:name=".EvaluationService"
            android:exported="false" />
    </application>

</manifest>
[doublepost=1463998916,1463997466][/doublepost]Wie kann ich das Thema jetzt als Gelöst markieren? Einfach den Titel ändern?
 

Ähnliche Themen

L
Antworten
15
Aufrufe
890
jogimuc
J
SpeedySix
Antworten
13
Aufrufe
1.387
jogimuc
J
S
Antworten
4
Aufrufe
954
Sempervivum
S
Zurück
Oben Unten