java - 安卓3.1 : Refactoring Button Code and Permissions to MVP Architecture

标签 java android android-permissions mvp

我有一个简单的一键应用程序。该应用程序显示一个调用电话的按钮。我在将代码清晰地重构为 MVP 架构时遇到困难。还有一个类似的问题( What's the best way to check for permissions at runtime using MVP architecture? )。然而,在这个问题中,答案还不够明确,无法应用于我的问题。

演示者的 View 中无法识别权限请求。我遇到的问题是在 startActivity(intent); 的 View 中。 Android Studio 用红色强调了 Intent ,并告诉我“调用需要权限,可能会被用户拒绝。代码应显式检查权限”。

为什么这种重构是错误的?我该如何纠正它以遵守 MVP 架构?

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void BtnSetEmergency_onclick(View view) {
    String number = "1112223333";
    final int REQUEST_PHONE_CALL = 1;
    Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:" + number));

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

        Toast.makeText(MainActivity.this, "One Button App", LENGTH_SHORT).show();

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
        }
        else{
            startActivity(intent);
        }

        return;
    }
    startActivity(intent);
  }
}

我重构 MVP 架构的尝试

查看

public class MainActivity extends AppCompatActivity {

mainActivityPresenter mainActivityPresenterObject = new mainActivityPresenter();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}


public void BtnSetEmergency_onclick(View view) {
    boolean phonePermissions = false;
    String number = "1112223333";
    final int REQUEST_PHONE_CALL = 1;
    Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:" + number));


    phonePermissions = mainActivityPresenterObject.checkPhonePermissions(view);

    if(phonePermissions == true){
        startActivity(intent);
    }else if (phonePermissions == false){

    }
  }
}

演讲者

public class mainActivityPresenter {

public boolean checkPhonePermissions(View view){
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

        Toast.makeText(MainActivity.this "One Button App", LENGTH_SHORT).show();

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
            return false;
        }
        else
        {
            return true;
        }
    }
    return false;
   }
}

================================================== ============>

编辑:应用基于 Nilesh Rathod 答案的最终答案

================================================== ============>

查看

public class MainActivity extends AppCompatActivity {

    mainActivityPresenter mainActivityPresenterObject = new mainActivityPresenter();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void BtnSetEmergency_onclick(View view) {
        boolean phonePermissions = false;
        int number = 1112223333;
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + Integer.toString(number)));

        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
            == PackageManager.PERMISSION_GRANTED) {
            startActivity(intent);
        }else {
            mainActivityPresenterObject.checkPhonePermissions(view, MainActivity.this);
        }
    }
 }

演讲者

public class mainActivityPresenter {
    final int REQUEST_PHONE_CALL = 1;

    public void checkPhonePermissions(View view, MainActivity mainActivity){
        ActivityCompat.requestPermissions(mainActivity, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
    }

} 

最佳答案

"Call requires permission which may be rejected by the user. The code should explicitly check for permissions"

其行为符合预期。

使用 startActivity(intent);

调用前需要检查用户是否授予调用权限

仅供引用

您可以使用 ActivityCompat.OnRequestPermissionsResultCall 处理权限对话框的结果

This interface is the contract for receiving the results for permission requests

试试这个

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
                == PackageManager.PERMISSION_GRANTED) {
       startActivity(intent);
}else {
     // ask here for call permission
}

关于java - 安卓3.1 : Refactoring Button Code and Permissions to MVP Architecture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745115/

相关文章:

java - 如何将数据存储在一个 fragment 中以将其获取到另一个 fragment 中?

调用paintComponent后Java Swing绘制图像

java - 解析 Android HttpResponse 缓存更新?

android - 权限拒绝 : reading com. android.providers.downloads.DownloadStorageProvider 需要 android.permission.MANAGE_DOCUMENTS

android - 如何对 android.graphics.Bitmap 和 BitmapFactory 进行单元测试?

android - AppCompatActivity 和 Marshmallow 权限

java - 关于 Java 文件加密性能的建议

java - Itext 5.5 + Hwcrypto.js 添加签名 "Document has been altered or corrupted since it was signed"

java - 在 Eclipse 中新建 Android 测试项目时出错

java - HTTP 发布请求 : target server failed to response