如本页所述
由于Android沙箱相互之间的应用程序,应用程序必须明确共享资源和数据.他们通过声明基本沙箱未提供的其他功能所需的权限来实现此目的,包括访问设备功能(如摄像头).
在我看来,在编译源代码时自动检测所需的权限会更有用.这样,根据应用程序源代码中使用的类和方法,编译器可以检测所需的权限.那么,为什么必须由开发人员明确声明Android权限?
所以我有2个应用程序--A和B.
在A我有一个BroadcastReceiver.在receiver标签(清单文件)中,我指定一个android:permission字符串(比方说com.example.app.SEND).现在B不能再向A发送广播了.说得通!
那么为了让B向A发送广播,我该怎么办呢?在B的清单,我指定的uses-permission标签与android:name设置为相同的字符串(com.example.app.SEND)作为接收方android:permission,但仍是广播不会的B到A.
我究竟做错了什么 ?还是还有其他需要做的事情?
- 更新 -
这是我的应用程序A的接收器标签:
<receiver
android:name="com.example.app.MyReceiver"
android:enabled="true"
android:exported="true"
android:permission="com.example.BReceiver.SEND" >
<intent-filter>
<action android:name="com.example.BReceiver" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这是uses-permission我B的清单上的标签:
<uses-permission android:name="com.pycitup.BReceiver.SEND" />
Run Code Online (Sandbox Code Playgroud) security android broadcastreceiver android-permissions android-broadcast
我想知道要求用户进行权限检查的最佳做法以及如果用户拒绝该特定权限访问则要运行的代码.
我面临一个奇怪的问题.我遵循本教程,以便在运行时为我构建的应用程序请求权限.问题在于,即使我检查设备是否使用Android M并且我在运行时请求权限,它也不显示对话框.
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
spinner = (Spinner)findViewById(R.id.database_selection_spinner);
button = (Button)findViewById(R.id.proceedBtn);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(ConfigurationActivity.this, Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED){
accessWebService();
}else {
if (shouldShowRequestPermissionRationale(Manifest.permission.INTERNET)){
StringGenerator.showToast(ConfigurationActivity.this, "Internet Permission needs to be granted");
}
requestPermissions(new String[]{Manifest.permission.INTERNET}, AppConstants.PERMISSION_REQ_CODE);
}
}else {
accessWebService();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == AppConstants.PERMISSION_REQ_CODE){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
accessWebService();
}else {
StringGenerator.showToast(ConfigurationActivity.this, "LOL");
}
}else { …Run Code Online (Sandbox Code Playgroud) android android-permissions android-6.0-marshmallow runtime-permissions
我使用EasyPermissions从谷歌库来处理Android上6.第一次权限我按一下按钮,捕捉图像,它要求我给权限CAMERA和WRITE_EXTERNAL_STORAGE.
在我接受了两个权限应用程序崩溃并显示错误消息后,您可以在下面看到:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.debug, PID: 22768
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=123, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.debug/com.example.camera.CameraActivity}: java.lang.RuntimeException: Cannot execute non-void method openCamera
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
Caused by: java.lang.RuntimeException: Cannot execute non-void method openCamera
at pub.devrel.easypermissions.EasyPermissions.runAnnotatedMethods(EasyPermissions.java:229)
at pub.devrel.easypermissions.EasyPermissions.onRequestPermissionsResult(EasyPermissions.java:186)
at com.example.camera.CameraActivity.onRequestPermissionsResult(CameraActivity.java:243)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
at android.app.Activity.dispatchActivityResult(Activity.java:6432)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at …Run Code Online (Sandbox Code Playgroud) 我尝试在Android 6.0上的外部SD卡上写一切,但我无法写上它.
我对stackoverflow进行了研究,发现了很多东西,但都没有.这是我的代码
String extPath = System.getenv("SECONDARY_STORAGE") + "/Android/data/com.gvm.externalstorage.externalstoragetest/";
File file = new File(extPath,"myFiles");
if (!file.exists()) {
boolean dirResult = file.mkdirs();
Log.e("Directory Exist", dirResult + " Directory created");
} else {
Log.e("Directory Exist", "Exist");
Log.e("Direcotry Path",file.getAbsolutePath());
}
//String displayname = fileName.replace("%20", " ");
File outputFile = new File(file, "mytest5.txt");
outputFile.createNewFile();
Run Code Online (Sandbox Code Playgroud)
此代码适用于Android 5.0,但不适用于Android 6.0.
然后我也尝试了这个路径,这给了我权限错误,我已经为运行时权限设置了所有权限和托管代码.
/mnt/media_rw/6AC9-083B
File write failed: java.io.IOException: open failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我,那么在过去的3天里我会这样做很棒.
谢谢,Anvesh
我是Android工作室的新手,我以前在我的应用程序上工作Android版本5.1它工作正常但现在在6我无法获得许可或我不确定我的方法是否错误.我正在制作一个应用程序,它使用我的手机可用的访问点列表.但即使我被授予权限,我的应用程序也没有向我显示wifi列表,但相同的代码适用于早期版本.
Mainactivity:
package com.wiferange.wifi_test;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ListView lv;
String lists[]={"a","b"};
WifiManager wifi;
String wifis[];
WifiScanReceiver wifiReciever;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
lv = (ListView)findViewById(R.id.listView);
wifi=(WifiManager)getSystemService(Context.WIFI_SERVICE); …Run Code Online (Sandbox Code Playgroud) android android-permissions android-studio android-6.0-marshmallow
我正在尝试获取读取日历的权限,获取权限后我试图调用另一个片段.我遇到了以下异常.这只发生在应用程序的第一次启动时.对于下一个启动应用程序工作正常.
5488-5488/com.mindtree.calenderevents E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mindtree.calenderevents, PID: 5488
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=2, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.mindtree.calenderevents/com.mindtree.calenderevents.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.deliverResults(ActivityThread.java:4998)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)
at android.app.ActivityThread.access$1600(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1533)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1551)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:696)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:662)
at com.mindtree.calenderevents.MainActivity.onRequestPermissionsResult(MainActivity.java:59)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7291)
at android.app.Activity.dispatchActivityResult(Activity.java:7169)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个Android应用程序,当通过Google Playstore安装时,应该可以访问运行时权限,如SMS Access,Contacts,Location Service,而无需向用户询问.
我知道这是可能的,因为我已经看到它发生在Playstore上的几个Android应用程序中,如Kotak 811 App Standard Chartered Banking App
有谁知道即使手机运行Android Nougat也能实现这一目标.
我运行代码时从不调用onRequestPermissionsResult().我的片段中有一个请求权限的方法:
void initiateGalleryUpload() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.read_storage_permission_rationale))
.setPositiveButton("OK", (dialog, which) -> {
Timber.d("Requesting permissions for read external storage");
requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, 1);
dialog.dismiss();
})
.setNegativeButton("Cancel", null)
.create()
.show();
} else {
requestPermissions(new String[]{READ_EXTERNAL_STORAGE},
1);
}
} else {
controller.startGalleryPick();
}
}
else {
controller.startGalleryPick();
}
Run Code Online (Sandbox Code Playgroud)
并且同一片段中的另一个方法覆盖onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Timber.d("onRequestPermissionsResult: req code = " + " perm = …Run Code Online (Sandbox Code Playgroud)