【问题标题】:How to properly ask for permissions on Runtime?如何正确请求运行时的权限?
【发布时间】:2016-04-04 18:38:50
【问题描述】:

您好,我正在使用 Android Studios 制作应用程序,总共需要 3 个权限

CALL_PHONE、READ_CONTACTS、RECORD_AUDIO。

我对开发有点陌生,这就是为什么我的编码有点草率(不是开玩笑),当我运行应用程序时,它不会请求许可并且不起作用,但是如果我手动去设置并授予它工作的权限美好的 我使用片段并在片段类中编写代码是错误的,或者我应该在我的 mainActivity.java 中编写此代码 我附上了这两个请看我的代码,我该如何改进它 如果我必须从头开始工作,我可以接受。

DialerActivity.java:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;


public class DialerActivity extends FragmentActivity {

private static final String FRAGMENT_TAG_DIALER = "fragment:dialer";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialer);

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = (DialerFragment) fm.findFragmentByTag(FRAGMENT_TAG_DIALER);

        if(fragment == null){
            fragment = new DialerFragment();
            fm.beginTransaction()
                    .add(R.id.fragment_container,fragment, FRAGMENT_TAG_DIALER)
                    .commit();
        }
}
}

DialerFragmnet.java:

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;;
import android.support.v4.content.ContextCompat;


public class DialerFragment extends Fragment {
  private EditText mPhoneField;
  private Button mDialButton;

//Requesting Permissions on Runtime.
final private int REQUEST_CODE_ASK_PERMISSIONS=0;

private void InitiateCall(){
    int hasCallPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE);
    if (hasCallPermission != PackageManager.PERMISSION_GRANTED){
        requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},
                REQUEST_CODE_ASK_PERMISSIONS);
        return;
    }
    InitiateCall();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults ){
   switch (requestCode){
       case REQUEST_CODE_ASK_PERMISSIONS:
           if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
               //YAY! PERMISSION GRANTED
               InitiateCall();
           }else{
               //GD! PERMISSION DENIED
               Toast.makeText(getActivity(), R.string.permission_denied, Toast.LENGTH_SHORT).show();
           }
            break;
       default:
           super.onRequestPermissionsResult(requestCode, permissions, grantResults);

   }
}



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
    View v=inflater.inflate(R.layout.fragment_dialer,container,false);

    mPhoneField=(EditText) v.findViewById(R.id.input_pno);
    mDialButton=(Button) v.findViewById(R.id.dial_button);

    mDialButton.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            try{
                if (mPhoneField != null && (mPhoneField.getText().length()==10||mPhoneField.getText().length()==11)){
                    startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mPhoneField.getText())));
                }
                else if(mPhoneField != null && mPhoneField.getText().length()==0){
                    Toast.makeText(getActivity(),R.string.no_number_toast,Toast.LENGTH_SHORT).show();
                }
                else if(mPhoneField !=null && mPhoneField.getText().length()<10){
                    Toast.makeText(getActivity(),R.string.wrong_number_toast,Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e){
                Log.e("DialerAppActivity","error: " + e.getMessage(),e);//Runtime error will be logged
            }
        }
    });


    return v;
}

}

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    实际上,您从不调用请求许可的方法。 你的方法:InitiateCall 不应该调用自己,因为它会创建一个无限循环。所以你应该把它修改成这样:

    private void InitiateCall(){
        int hasCallPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE);
        if (hasCallPermission != PackageManager.PERMISSION_GRANTED){
            requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},
                    REQUEST_CODE_ASK_PERMISSIONS);
            return;
        }
    }
    

    您可以在onCreateView 末尾拨打InitiateCall

    【讨论】:

    • 如果我在 onCreateView 的末尾调用该函数,它表示该方法无法访问,但如果我在 mDialButton 上的侦听器之前调用它,它可以工作,而且我的编码结构正确吗?我的意思是我觉得事情不在适当的地方。
    • 如果你在它不会编译之前调用它,你需要在return v;之前调用它,因为onCreateView方法在你调用return之后停止。这就是为什么它之后无法访问的原因。
    • 感谢工作的人!现在我将添加权限的理性部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多