마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 하이브리드앱 전화걸기 질문입니다..

0 추천
class GoTel{
    @JavascriptInterface
    public void TelAction(String str){
        Log.d("test", str);
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+str));
        startActivity(intent);
    }

}
이렇게 햇는데 
startActivity(intent);

이 부분에서 빨간줄이 자꾸 가는데 모르겠네요....

현재 버전은 마쉬멜로우를 보고있습니다..

람쥐i (200 포인트) 님이 2016년 11월 28일 질문

1개의 답변

0 추천

안녕하세요

권한이 필요한 것 같습니다.

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

매니페스트에 추가하시고, OS 마쉬멜로우 같은 경우 권한체크하는 로직이 필요합니다.

아래 소스를 응용하셔서 코드 작성하시면 되겠습니다! 도움되시길

private void checkPermission() {
      // 마시멜로 이전 버전 권한 체크 필요없음
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
         runApp();
         return;
      }

      // 권한 있는지 여부 체크
      // checkSelfPermission() 리턴 값이 0 이면 권한 있음. -1 이면 권한 없음
      // 권한 종류 : 카메라, 메모리 읽기/쓰기, 전화, 위치, 네트워크 상태
      if (checkSelfPermission(Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.CALL_PHONE)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE)
            != PackageManager.PERMISSION_GRANTED) {

         // 권한 요청
         ActivityCompat.requestPermissions(this,
               permissions,
               MY_PERMISSIONS);


      }else{ 
        runApp(); // 권한이 이미 다 허용 됐을 경우 메인으로 이동
      }
   }

   @Override
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      // TODO Auto-generated method stub

      switch (requestCode) {
         case MY_PERMISSIONS:

            if (grantResults.length > 0) {
               // 권한 허가
               // 해당 권한을 사용해서 작업을 진행할 수 있습니다
               for (int i = 0; i < grantResults.length; i++) {
                  if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
                     Toast.makeText(this, "앱을 실행하기 위한 권한이 필요합니다.", Toast.LENGTH_SHORT).show();
                     // 셋팅 화면으로 이동 후 권한 얻기
//                    startActivity(new Intent(Settings.ACTION_SETTINGS));
                     return;
                  }
               }
               runApp();// 권한체크가 끝났을 경우 메인으로 이동
            }
            break;
      }

      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
   }
히로시 (10,800 포인트) 님이 2016년 11월 28일 답변
감사합니다.! 혹시 하나만 더 질문 해도 될까요...
현재 jsp 부분에서
function GoTel(phone){
    alert(phone);
    window.TelAndroid.TelAction(phone);
} 이러한 식으로 값을 보내고 있는데 함수만 들어가면
I/chromium: [INFO:CONSOLE(52)] "Uncaught TypeError: Cannot call method 'TelAction' of undefined"
이러한 식으로 안드로이드에서 오류가 나는데 이유좀 알수 있을까요..?ㅠㅠ
TelAction 메소드가 정의 되지 않았다고 에러 메세지가 나오는데...
하이브리드 앱은 안해봐서요...; 로그인을 안하고 댓글달아서 익명으로 달렸네;;
감사합니다...
좀 더 찾아봐야겠어요 ..ㅠㅠ
...