Jump to content

Runtime Permissions Android


Psycop

Recommended Posts

Boa noite, 

Estou com alguma dificuldade em conseguir fazer o pedido das permissões em runtime, sendo que apenas o dialog de aceitação de permissões de uma das duas permissoes necessárias é mostrado quando clico no button.

        /*Button PANIC Button
        @ Click this button to send a PANIC message to defined contact
        @ Inside the message go a PANIC message, name of person and GPS location
        */
        Button button_panic = (Button) findViewById(R.id.button_panic);
        button_panic.setOnClickListener(new OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View v) {

                if(ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                        ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)
                {
                    requestLocationPermission();
                    requestSMSPermission();

                    String Message = "GRANTED";
                    Log.i("Location permission", Message);
                }
                else
                {
                    sendMsg();
                }
            }
        });
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void getLocation() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.


            //requestLocationPermission();

            return;
        }
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);

        String longitudeString = String.valueOf(location.getLongitude());
        String latitudeString = String.valueOf(location.getLatitude());

        message = "PANIC - Preciso de Ajuda " + Nome + " " + Apelido + ". " + "Esta é a minha localização: Latitude: " + latitudeString + " Longitude: " + longitudeString;

        Log.e("Log Message", message);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void sendMsg() {

        getLocation();

        SmsManager smsManager = SmsManager.getDefault();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            requestSMSPermission();
        }

        if (location != null) {
            smsManager.sendTextMessage(Telefone, null, message, null, null);
            Toast.makeText(MainActivity.this, "Sent to " + Telefone, Toast.LENGTH_SHORT).show();
        } else {
            smsManager.sendTextMessage(Telefone, null, "test", null, null);
            Toast.makeText(MainActivity.this, "Please open your location service", Toast.LENGTH_SHORT).show();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void requestSMSPermission() {
        requestPermissions(new String[]{Manifest.permission.SEND_SMS}, REQUEST_PERMISSION_SEND_SMS_CODE);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void requestLocationPermission() {
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_FINE_LOCATION_CODE);
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_COARSE_LOCATION_CODE);
    }

A questão das permissões ao executar o metodo onClickButton é apresentada de imediato o dialog para permitir a localização, mas apos permitir a app crasha e pelos logs reporta o seguinte erro referente à falta da permissão para SMS. No entanto se eu arrancar de novo a app, agora já com a permissão para a localização garantida, e executar de novo o metodo onClickButon é apresentada o dialog para a permissão do SMS.

Citação

java.lang.SecurityException: Sending SMS message: uid 10229 does not have android.permission.SEND_SMS.
                                                                                    at android.os.Parcel.readException(Parcel.java:1620)
                                                                                    at android.os.Parcel.readException(Parcel.java:1573)
                                                                                    at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
                                                                                    at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:333)
                                                                                    at android.telephony.SmsManager.sendTextMessage(SmsManager.java:299)
 

Além disso pelos log's eu consigo ver que a mensagem é gerada com sucesso, e pela impressão do Toast 'Sent to 93xxxxxxx' consigo perceber que foi executado o método mas na realidade a SMS nunca chega ao destino.

Alguém me pode ajudar a ajeitar isto de forma a conseguir ter tudo funcional...

Link to comment
Share on other sites

Há alguma razão para não teres isso logo definido no manifesto?

Presumo que estás a fazer debug num dispositivo real e não no emulador, correto?

Podes experimentar noutros dispositivos, de preferência de marcas e modelos diferentes?

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

28 minutos atrás, Psycop disse:

A partir do SDK 23 é necessário fazer o pedido das permissões em Runtime...

Se continuasse a ser apenas no Manifest estava eu bem contente e sem este tipo de problemas...

Não é isso que está na documentação. A partir da API 23 é a apresentação do pedido de permissões é feito em runtime em vez de no momento de instalação mas a declaração das permissões continua a ser feito no Manifest. A declaração das permissões pelo programador é feita da mesma maneira em qualquer versão, a forma como o SO apresenta o pedido ao utilizador é que difere.

Continuo a fazer a declaração no Manifest e continua a funcionar, para mim como programador, como antes.

Link to comment
Share on other sites

7 horas atrás, Knitter disse:

Não é isso que está na documentação. A partir da API 23 é a apresentação do pedido de permissões é feito em runtime em vez de no momento de instalação mas a declaração das permissões continua a ser feito no Manifest. A declaração das permissões pelo programador é feita da mesma maneira em qualquer versão, a forma como o SO apresenta o pedido ao utilizador é que difere.

Continuo a fazer a declaração no Manifest e continua a funcionar, para mim como programador, como antes.

Sim eu expressei-me mal. Querendo dizer que agora além de declarar as permissões no Manifest tem de ser ainda feito o pedido em runtime o que anteriormente não era necessário.

BTW: tendo alguma experiência com este tipo de permissões conseguirias ajudar-me a resolver este problema?

Cumps

Link to comment
Share on other sites

Não podes fazer dois pedidos de permissões seguidos, aliás deves ter um aviso desses no log, e tendo em conta que as duas permissões de localização estão no mesmo grupo, ao pedires uma o Android dá a outra automaticamente. Tens de invocar o método requestPermissions uma vez, com todas as permissões que pretendes pedir ou invocar em momentos diferentes garantindo que um pedido anterior já terminou antes de fazeres outro. Os pedidos de permissões são assíncronos, tens de implementar o método onRequestPermissionsResult que te devolve o resultado do pedido.

  • Declarar no Manifest;
  • Em runtime pedir todas as permissões numa só chamada ao requestPermissions;
  • Implementar o método onRequestPermissionsResult
Link to comment
Share on other sites

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.