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

커스텀리스트뷰 onitemclick리스너 궁금합니다

0 추천
@Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Object ob = adapterView.getAdapter().getItem(i);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            //사용자가 권한승인을 했는지 확인
            //안했으면 권한요청
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, RUNTIME_PERMISSIONS_REQUEST_CALL_PHONE);
        } else {
            startCall();//전화거는 메쇼드

        }

    }


////요기는 퍼미션부분이고 전화거는 거에 대한 ...   OnitemClick리스너를 이용하는 중이였고 저기 startCall메소드가

 private void startCall() {//인텐트를 생성하고 액션과 데이터를 저장한 후에 전화걸기 화면 실행


        Intent callIntent = new Intent();
        callIntent.setAction(Intent.ACTION_CALL);//통화액션

        callIntent.setData(Uri.parse("tel:" + ));
        startActivity(callIntent);

    }

이거인데 starCall메소드로 어댑터뷰에 대한 정보를 넘길수가 있을까요,,,
달려갑니다 (280 포인트) 님이 2019년 10월 27일 질문

1개의 답변

0 추천
aucd29 (218,390 포인트) 님이 2019년 10월 28일 답변
네 답변 감사합니다 ..제가 엄청 초보인지라 2시간동안 알아보면서 저 위에 사이트위에 있는 코드보면 무슨 말인지도 잘 모르겠고 그나마  알만한 라이브러리가 테드퍼미션 라이브러리라는 게 있길래  사용을 해 봤는데 그 라이브러리는 권한체크만 가능 하더라구요.권한요청을 어떤식으로 해야하는지 잘 모르겠습니다
혹시 시간이 쫌 괜찮으시다면 알려주실 수 있나요???

@Override
    public void onClick(View view) {


        PermissionListener permissionlistener = new PermissionListener() {
            @Override
            public void onPermissionGranted() {
                Toast.makeText(MainActivity.this, "권한 허가", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPermissionDenied(ArrayList<String> deniedPermissions) {
                Toast.makeText(MainActivity.this, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
            }


        };

        
        TedPermission.with(this)
                
                .setPermissionListener(permissionlistener)
                .setRationaleMessage("전화걸기에는 전화권환설정이 필요해요")
                .setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
                .setPermissions(Manifest.permission.ANSWER_PHONE_CALLS)
                .check();

        startCall();

    }
onPermissionGranted 메소드 안에 startCall 이 들어가면 됩니다.
계속 자동으로 권한거부로 체크가 되는 것 같아여..ㅠ 저기 메시지 2개가 있는데
전화걸기에는 권한설정이 필요해요 하고 왜 거부하셨어요가 바로 뜨더라구요..
저 메세지는 권한거부를 해야 떠야하는 부분이 아닌가여 ??
애초에 public void onPermissionGranted() {
             
                Toast.makeText(MainActivity.this, "권한 허가", Toast.LENGTH_SHORT).show();
 startCall();

            } 이 부분이 동작을 안 하는 것 같아요...어캐해야하지  저 맨밑에 startCall부분을 지우니까 통화자체가 안되네요 말씀하신 부분에 startCall넣고나서여
1. 일단 앱을 지우고 다시 설치해보세요
이전에 거부를 해놔서 자동으로 왜 거부하셨어요가 뜨는것일 수도 있습니다.
2. 지우고 다시 설치했는데도 뜬다면 코딩 자체가 잘못되었을 가능성이 존재 합니다.
3. 사용자가 권한을 허가해주면 onPermissionGranted 으로 콜백이 올것으로 예상되며 허가된 상태이기 때문에 startCall 이 동작해야 됩니다.
4. 현재 동작중인 단말또는 에뮬의 api level 이 몇이냐에 따라서 동작이 다르게 될 수도 있습니다. 이점 고려하세요
쩝...안되네요 코드 어딘가의 문제인가 봅니다 ㅠㅠ
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    static int im;

    final int RUNTIME_PERMISSIONS_REQUEST_CALL_PHONE = 1;//퍼미션 변수
    final int INTENT_REQUEST = 1;//인텐트(option 신호값)
    private ListView m_oListView = null;//리스트뷰를 넣기 위한 변수
    private ArrayList<item> list_item = new ArrayList<>();//item 배열



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



        Button btn1 = (Button) findViewById(R.id.btn1);//버튼
        View sss = getLayoutInflater().inflate(R.layout.list_item, null, false);
        ImageButton img = sss.findViewById(R.id.imb2);



        btn1.setOnClickListener(new View.OnClickListener() {//+버튼클릭 리스너

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), option.class);//클릭하면 옵션 액티비티로 넘어감
                startActivityForResult(intent, INTENT_REQUEST);
            }
        });


    }

    private void startCall() {//인텐트를 생성하고 액션과 데이터를 저장한 후에 전화걸기 화면 실행

        for(int i = 0; i < m_oData.size(); i++) {
            Hashtable<String, String> hashtable = new Hashtable<>();
            hashtable.put(m_oData.get(i).name, m_oData.get(i).number);

            for (int k = 0; k < m_oData.size(); k++){
                Intent callIntent = new Intent();
                callIntent.setAction(Intent.ACTION_CALL);//통화액션
                callIntent.setData(Uri.parse("tel:" + hashtable.get(m_oData.get(k).name)));//번호저장
                startActivity(callIntent);
            }
        }

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {//옵션 액티비티 결과 수신
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == INTENT_REQUEST && resultCode == AppCompatActivity.RESULT_OK) {//신호가 ok이고 인텐트 번호가 맞ㅈ다면
            String name = data.getStringExtra("name");//이름 번호 가져오기
            String number = data.getStringExtra("phone");

            item item_list = new item();
            item_list.name = name;
            item_list.number = number;
            list_item.add(item_list);
            item_list.onClickListener = this;
            //가져온 이름 번호를 아이템객체에 넣기
        }
        m_oListView = (ListView) findViewById(R.id.list);//리스트뷰 연결
        Adapter oAdapter = new Adapter(list_item, getApplication());//어댑터 객체 생성
        m_oListView.setAdapter(oAdapter);//어댑터 장착

    }




    @Override
    public void onClick(View view) {


        PermissionListener permissionlistener = new PermissionListener() {
            @Override
            public void onPermissionGranted() {
                Toast.makeText(MainActivity.this, "권한 허가", Toast.LENGTH_SHORT).show();
                startCall();

            }

            @Override
            public void onPermissionDenied(ArrayList<String> deniedPermissions) {
                Toast.makeText(MainActivity.this, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
            }


        };


        TedPermission.with(this)

                .setPermissionListener(permissionlistener)
                .setRationaleMessage("전화걸기에는 전화권환설정이 필요해요")
                .setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
                .setPermissions(Manifest.permission.ANSWER_PHONE_CALLS)
                .check();

        startCall();


    }






}

근데 어딜봐도 코드상의 문제는 또 아아닌 것 가같아여
1. flow 를 보면 btn1 을 선택 하면 option activity 가 뜨고 먼가에 의해 결과 값이 오는걸로 보이는데
2. 결과값으로 오는건 name, phone 인데 item 정체가 무엇인지 click listener 를 등록하고????
3. click listener 에 의해 permission 허가 내용이 뜨는데
4. 알수 없는 for 문을 도네요 ? for 문안에서 왜 startActivity 가 존재하는걸까요?
우선 이렇게 답변을 해주셔서 정말 감사드립니다 ㅠㅠㅠㅠ 혼자 힘으로 해볼려고 많이 일주일정도 삽질을 해봤는데 잘 안풀리더군여

2.아이템에도 클릭 리스너를 등록했고 커스텀리스트뷰의  아이템도 name , phone입니다 ~ 현재 전화번호부 어플을 만들고 있는데 option액티비티에는 이름과 번호를 저장하고 저장을 하면 커스텀리스트뷰로 name phone결과값이 넘어갑니다
3.3번은 잘 이해가 안됩니다 ㅠㅠㅠ
4.우선 for문 같은 경우는  퍼미션부분을 해결하기 위해서 임시적으로 작성한 코드입니다. 원래는 OnitemClick리스너를 사용하려고 했는데 잘 이해도 안되는 부분들도 많아서 잘 사용을 못하겠더라구요...그래서 우선 퍼미션 부분을 해결하고 싶어서 작성을 저렇게 작성을 해봤습니다 startActivity같은 경우는 좀 생각없이 제가 작성을 해봤나봅니다 ㅠㅠ
1. click listener 는 adapter 내에 inflate 부분에서 보통 view 에 걸어둡니다.
2. 일단 책을 찾아보시는 편이 나아 보이긴하는데 adapter 안에서 click listener 를 어떤식으로 하는지를 봐보세요 - 일단 링크 겁니다. https://recipes4dev.tistory.com/45
3. 퍼미션은 기 완성된 라이브러리 이기에 따로 신경쓸건 없습니다. ANSWER_PHONE_CALLS 이 런타임퍼미션 항목인가요? androidManifest.xml 에는 퍼미션을 어떻게 추가했는지도 확인하세요
답변 감사합니다
링크통해서 꼼꼼히 공부해보겠습니다
androidManifest랑 퍼미션  부분이 같아야 하는지도 몰랐네여ㅠㅠ 이 부분도 확인해보겠습니다
말씀하신대로 퍼미션부분을 일치하게 하니까 잘 됩니다 ~~ 제가 너무 마음이 급했나봐요 블로그도 대충 훑어보고 한 것 같네요 ..ㅠㅠ
저도 잘 안지켜지긴 하지만 코드보단 메뉴얼 숙지 잘하시면 좋더라구요
aucd29님 덕분에 원하는대로 어플이 동작을 합니다 ~~ ㅎㅎ 감사합니다
...