Estou tentando escrever um código para enviar um SMS de um aplicativo Android, mas quando tento enviar o SMS, ele retorna o erro:
09-17 18:37:29.974 12847-12847/**.**.****E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: **.**.****, PID: 12847
java.lang.SecurityException: Sending SMS message: uid 10092 does not have android.permission.SEND_SMS.
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293)
at **.**.****.MainActivity$3.onClick(MainActivity.java:70)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Eu verifiquei, mas tenho as permissões no manifesto, da seguinte maneira:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-feature android:name="android.hardware.telephony"
android:required="true"/>
<application
android:exported="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Pesquisei na internet, mas todos os erros eram sobre a <uses-permission/>
sintaxe, você poderia me ajudar, por favor?
java
android
android-permissions
Nathan Loudjani
fonte
fonte
targetsdkversion
foi23
atualizado para a permissão de27
atualização de aplicativoREAD_SMS
não está funcionando, o que já está ativado. por favor ajudeRespostas:
(o seguinte é extraído de uma publicação minha no blog sobre isso )
O grande motivo para não obter sua permissão hoje em dia é porque seu projeto tem
targetSdkVersion
23 ou mais, e a permissão que você está solicitando é "perigosa". No Android 6.0, isso inclui:ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ADD_VOICEMAIL
BODY_SENSORS
CALL_PHONE
CAMERA
GET_ACCOUNTS
PROCESS_OUTGOING_CALLS
READ_CALENDAR
READ_CALL_LOG
READ_CELL_BROADCASTS
READ_CONTACTS
READ_EXTERNAL_STORAGE
READ_PHONE_STATE
READ_SMS
RECEIVE_MMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECORD_AUDIO
SEND_SMS
USE_SIP
WRITE_CALENDAR
WRITE_CALL_LOG
WRITE_CONTACTS
WRITE_EXTERNAL_STORAGE
Para essas permissões, o
targetSdkVersion
aplicativo mais de 23 anos não precisa apenas ter o<uses-permission>
(s) elemento (s), mas você também precisa solicitar essas permissões em tempo de execução ao usuário em dispositivos Android 6.0+, usando métodos comocheckSelfPermission()
erequestPermissions()
.Como solução temporária, reduza o número
targetSdkVersion
abaixo de 23.No entanto, eventualmente, você terá algum motivo para querer
targetSdkVersion
ter 23 anos ou mais. Nesse momento, você precisará ajustar seu aplicativo para usar o novo sistema de permissão de tempo de execução. A documentação do Android tem uma página dedicada a este tópico .fonte
compile 'com.android.support:appcompat-v7:22.2.1'
. Devo mudar isso para v4?23.x.y
para valores atuais de xey), em vez da v22 que você está usando no momento.Acima do nível 23 da API, você receberá programaticamente de forma pragmática:
fonte
solicitar permissão pragmaticamente (após a API 23)
"Se o aplicativo tiver permissão, o método checkSelfPermission () retornará PERMISSION_GRANTED e o aplicativo poderá prosseguir com a operação.
Se o aplicativo não tiver permissão, o método retornará PERMISSION_DENIED e o aplicativo deverá solicitar explicitamente permissão ao usuário. Você precisa solicitar ao usuário essa permissão, conforme mostrado no código acima. Chamar requestPermissions () exibe uma caixa de diálogo padrão do Android, que você não pode personalizar. "
fonte
Se você estiver usando o sdk 23 ou superior, verifique as permissões de tempo de execução.
fonte
quando você declarar
permisson
noManifest
e não é trabalho significa que você está executando tarefas noMarshMallow
e paraMarshMallow
você definiu permisson noRunTime
.assim
fonte
Por favor, acesse o link abaixo, https://developer.android.com/guide/topics/permissions/overview.html
Algumas amostras também estão disponíveis lá para começar com as permissões.
Para tornar o android mais seguro, agora os desenvolvedores precisam mencionar a permissão no manifesto e também devem solicitar ao usuário, em tempo de execução, que faça o trabalho. Eles são permissão categorizada na seção de permissão perigosa, mencionada abaixo
CALENDÁRIO
CÂMERA
CONTATOS
LOCALIZAÇÃO
MICROFONE
TELEFONE
SENSORES
SMS
ARMAZENAMENTO
fonte
Adicionei isso ao meu MainActivity, que resolve meu problema
fonte
Se você estiver usando a versão Android "23" ou "23+", o aplicativo mostrará erros quando você estiver tentando acessar qualquer coisa que exija a permissão do usuário. Você precisa solicitar permissões em tempo de execução, mesmo se tiver declarado essas permissões no manifesto do Android.
Verifique isto: https://developer.android.com/training/permissions/requesting.html
Mas se você criou todo o seu aplicativo e não deseja mudar em todos os lugares, um pequeno truque será suficiente.
Vá para o arquivo "Build.gradle" e altere a versão do Sdk de destino para menos de 23, como 22, 21.
fonte
Juntamente com a resposta do CommonsWare,
Há uma configuração de segurança (verifiquei no CM13) para definir o limite de mensagens SMS. Se você definir como "Nenhum", o SO abrirá uma caixa de diálogo para cada SMS, mesmo após a obtenção da permissão SMS_SEND no tempo de execução. O melhor é definir isso para o máximo.
Se o máximo não for suficiente, existem maneiras de aumentar a taxa máxima em um dispositivo raiz.
fonte
Você pode usar esse código para acessar suas mensagens
Abra uma caixa de diálogo usando o código abaixo:
Obtenha o resultado da atividade como abaixo:
ou edite o
build.gradle
número do arquivo e do chanchetargetSdkVersion
menor que23
E não precisa mais do código acima
NOTA
É claro que esse não é o caso, e é apenas um aspecto educacional
fonte
Então, eu tive que criar um aplicativo para enviar e receber mensagens, mas a ação de envio falhava sempre que eu clicava em enviar, mesmo com a permissão concedida. Eu havia solicitado permissões de tempo de execução e permitido, ainda assim eu enfrentei uma falha que o processo não tem a permissão solicitada para enviar SMS. Eu verifiquei as permissões concedidas em:
A ordem do meu pedido de permissões foi
Reverti a ordem do pedido e funciona bem. Isso foi testado com um novo aplicativo completo (desinstalar-> instalar -> testar). A resposta pode parecer estranha, mas apenas tente.
(Se funcionar da maneira mostrada em uma determinada ordem, o Android poderá ter um erro!)
fonte
Espero que a solução para gravar no armazenamento externo seja útil também
fonte
A lista de todas as permissões pode ser encontrada com explicação em
Manifest.permission
fonte