运行时权限问题
issue with Runtime Permission
我不知道为什么,但我的运行时权限代码不起作用。不出现弹窗。未经许可出现进度条
谁能帮帮我?
提前谢谢大家!
我给你看我的代码:!
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the custom_spinner_items for this fragment
View rootView = inflater.inflate(R.layout.fragment_four, container, false);
Button mButton = (Button) rootView.findViewById(R.id.cazzo);
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (hasPermissions()) {
// our app has permissions.
FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
/* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*/
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();
} else {
//our app doesn't have permissions, So i m requesting permissions.
requestPerms();
}
/* FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
*//* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*//*
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
*/
/* string4=tf.showResult(v);
totalebibite=tf.showResult2(v);*/
/* processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();*/
}
});
TextView titolo2 = (TextView) rootView.findViewById(R.id.result2);
return rootView;
}
关于权限的代码:
private void requestPerms(){
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(permissions,PERMS_REQUEST_CODE);
}
}
private boolean hasPermissions(){
int res = 0;
//string array of permissions,
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
for (String perms : permissions){
res = checkCallingOrSelfPermission(getContext(),perms);
if (!(res == PackageManager.PERMISSION_GRANTED)){
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean allowed = true;
switch (requestCode){
case PERMS_REQUEST_CODE:
for (int res : grantResults){
// if user granted all permissions.
allowed = allowed && (res == PackageManager.PERMISSION_GRANTED);
}
break;
default:
// if user not granted permissions.
allowed = false;
break;
}
if (allowed){
//user granted all permissions we can perform our task.
//makeFolder();
FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
/* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*/
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();
}
else {
// we will give warning to user that they haven't granted permissions.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(getContext(), "Storage Permissions denied.", Toast.LENGTH_SHORT).show();
}
}
}
}
请试试这个对我有效。
我在 Fragment 中使用联系人权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
runReadContact();
} else {
ActivityCompat.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, MyActivity.PERMISSION_CODE);
}
} else {
runReadContact();
}
onRequestPermission()
在 MyActivity (Activity Class) 中这样使用
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case MyActivity.PERMISSION_CODE:
if (grantResults.length > 0)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
runReadContact();
}
}
break;
}
}
如果你想在片段中使用 onRequestPermission()
我们需要注意一下。
1) android.support.v4.app.Fragment; => 导入 android.app.Fragment
2) FragmentCompat.requestPermissions(...
3) 你在它有效的片段中使用这个 "onRequestPermissionsResult(..."。
你的tarketSdkVersion是多少?
需要运行时权限 (23 >= tarketSdkVerison)
并检查您的应用,
移动"phone > setting > application > your app > permission"
您拒绝您的许可。那么你 运行 你的应用程序
- 调试您的应用程序检查是否有 hasPermissions() 函数 returns
true 或 false 为真则您的应用程序已经有一个
允许它不会显示弹出窗口。
- 检查您的 Manifest.xml 文件。如果它定义了权限并且您 运行 低于 API 级别 23,它仍然不会显示弹出窗口。
- 运行 您在 API 级别 23(棉花糖)及以上设备上的应用程序。
希望这能解决您的问题。
我不知道为什么,但我的运行时权限代码不起作用。不出现弹窗。未经许可出现进度条
谁能帮帮我?
提前谢谢大家!
我给你看我的代码:!
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the custom_spinner_items for this fragment
View rootView = inflater.inflate(R.layout.fragment_four, container, false);
Button mButton = (Button) rootView.findViewById(R.id.cazzo);
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (hasPermissions()) {
// our app has permissions.
FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
/* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*/
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();
} else {
//our app doesn't have permissions, So i m requesting permissions.
requestPerms();
}
/* FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
*//* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*//*
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
*/
/* string4=tf.showResult(v);
totalebibite=tf.showResult2(v);*/
/* processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();*/
}
});
TextView titolo2 = (TextView) rootView.findViewById(R.id.result2);
return rootView;
}
关于权限的代码:
private void requestPerms(){
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(permissions,PERMS_REQUEST_CODE);
}
}
private boolean hasPermissions(){
int res = 0;
//string array of permissions,
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
for (String perms : permissions){
res = checkCallingOrSelfPermission(getContext(),perms);
if (!(res == PackageManager.PERMISSION_GRANTED)){
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean allowed = true;
switch (requestCode){
case PERMS_REQUEST_CODE:
for (int res : grantResults){
// if user granted all permissions.
allowed = allowed && (res == PackageManager.PERMISSION_GRANTED);
}
break;
default:
// if user not granted permissions.
allowed = false;
break;
}
if (allowed){
//user granted all permissions we can perform our task.
//makeFolder();
FiveFragment ff = new FiveFragment();
numeroTavolo = ff.showResultTavolo(v);
MyListFragment mlf = new MyListFragment();
/* try {
mlf.showResultTotale(v);
} catch (IOException e) {
e.printStackTrace();
}*/
string2 = mlf.showResultTotale2(v);
totalepizze = mlf.showResultTotale(v);
ThreeFragment tf = new ThreeFragment();
string4 = tf.showResult(v);
totalebibite = tf.showResult2(v);
processingDialog.show();
mProgressbarAsync = new MakePDF();
mProgressbarAsync.execute();
new MakePDF(getContext()).execute();
}
else {
// we will give warning to user that they haven't granted permissions.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(getContext(), "Storage Permissions denied.", Toast.LENGTH_SHORT).show();
}
}
}
}
请试试这个对我有效。
我在 Fragment 中使用联系人权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { runReadContact(); } else { ActivityCompat.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, MyActivity.PERMISSION_CODE); } } else { runReadContact(); }
onRequestPermission()
在 MyActivity (Activity Class) 中这样使用@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MyActivity.PERMISSION_CODE: if (grantResults.length > 0) if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { runReadContact(); } } break; } }
如果你想在片段中使用 onRequestPermission() 我们需要注意一下。
1) android.support.v4.app.Fragment; => 导入 android.app.Fragment
2) FragmentCompat.requestPermissions(...
3) 你在它有效的片段中使用这个 "onRequestPermissionsResult(..."。
你的tarketSdkVersion是多少?
需要运行时权限 (23 >= tarketSdkVerison)
并检查您的应用,
移动"phone > setting > application > your app > permission"
您拒绝您的许可。那么你 运行 你的应用程序
- 调试您的应用程序检查是否有 hasPermissions() 函数 returns true 或 false 为真则您的应用程序已经有一个 允许它不会显示弹出窗口。
- 检查您的 Manifest.xml 文件。如果它定义了权限并且您 运行 低于 API 级别 23,它仍然不会显示弹出窗口。
- 运行 您在 API 级别 23(棉花糖)及以上设备上的应用程序。
希望这能解决您的问题。