2016-01-20 71 views
5

我想基本上拨一个号码,当用户点击该拥有多项一个TextView:从拨号盘主叫号码返回警告:“呼叫需要可以由用户拒绝许可”

number_title.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Intent callIntent = new Intent(Intent.ACTION_CALL); 
         callIntent.setData(Uri.parse("tel:+"+user.getTelephone())); 
         activity.startActivity(callIntent); 
         //the above line returns the warning given below 
        } 
}); 

警告我得到:

调用需要可能被用户拒绝的权限。代码 明确地检查,看看是否允许可用

据我所知,应用程序需要如果权限以前尚未授予请求权限。我的问题是,在拨打电话之前,我如何明确请求许可?

+0

这是关于运行时权限,不是吗? –

+0

@JörnBuitink是的! – Dinuka

回答

2

好吧,这是关于运行时权限,所以只声明他们在清单中将无法正常工作。相反,您必须在开始通话之前检查权限。

像这样的东西应该工作 - 用户将仅会要求许可,如果他以前没有授予它(或他是否撤销的话):

private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1234; 

public void yourfunction() { 
    number_title.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if (ContextCompat.checkSelfPermission(thisActivity, 
               Manifest.permission.CALL_PHONE) 
           != PackageManager.PERMISSION_GRANTED) { 

         ActivityCompat.requestPermissions(activity, 
          new String[]{Manifest.permission.CALL_PHONE}, 
          MY_PERMISSIONS_REQUEST_CALL_PHONE); 
        } else { 
         executeCall(); 
        } 
       } 
    }); 
} 

private void executeCall() { 
    // start your call here 
    activity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Intent callIntent = new Intent(Intent.ACTION_CALL); 
      callIntent.setData(Uri.parse("tel:+"+user.getTelephone())); 
      activity.startActivity(callIntent);   
     } 
    }); 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, 
    String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_CALL_PHONE: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! 
       executeCall(); 


      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 
    } 
} 

我把上面的代码主要来自谷歌: http://developer.android.com/training/permissions/requesting.html 如果您想了解更多信息,请访问链接。

编辑: onRequestPermissionsResult将在您的活动中成为回调函数。您可能需要在那里处理电话。

0

使用,这可能这将工作:

<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+1

这不会帮助。问题是关于运行时权限。 –

+0

我想你是使用任何第三方应用程序或任何防病毒应用程序来阻止权限。 – Ankur1994a

+0

我想在运行时请求Call_phone的权限。我已经将这些添加到清单 – Dinuka

2

这仅仅是一个用于检查许可引用调用的示例:

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

    requestPermissions(this,new String {}(Manifest.permission. CALL_PHONE),INT_TO_CHECK RESULT); 

} 

让我知道这是否正常工作。

修改:对代码进行了更改解释。

+0

您可以在示例代码中显示吗?有点困惑替代你已经显示的变量替代什么 – Dinuka

+0

@Earthling:现在检查代码! –

+0

同时检查添加运行时权限的链接。 http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en –