Psycop Posted February 14, 2017 at 09:23 PM Report Share #602499 Posted February 14, 2017 at 09:23 PM 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 More sharing options...
M6 Posted February 15, 2017 at 09:34 AM Report Share #602507 Posted February 15, 2017 at 09:34 AM 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 More sharing options...
Psycop Posted February 15, 2017 at 01:41 PM Author Report Share #602511 Posted February 15, 2017 at 01:41 PM 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... Link to comment Share on other sites More sharing options...
Knitter Posted February 15, 2017 at 02:12 PM Report Share #602512 Posted February 15, 2017 at 02:12 PM 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 More sharing options...
Psycop Posted February 15, 2017 at 09:36 PM Author Report Share #602529 Posted February 15, 2017 at 09:36 PM 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 More sharing options...
Knitter Posted February 16, 2017 at 08:43 AM Report Share #602544 Posted February 16, 2017 at 08:43 AM 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 More sharing options...
badjoras Posted March 31, 2017 at 05:44 PM Report Share #603458 Posted March 31, 2017 at 05:44 PM é obrigatório meter sempre as permissões no manifest, so um fix a outros comentarios "Não podes fazer dois pedidos de permissões seguidos" Podes fazer os pedidos como quiseres, seguidos ou não, e podes usar o requestPermissions as vezes que quiseres. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now