0

내 애플리케이션에서 전화로 연락처에 액세스하는 중에 오류가 발생했습니다. android marshmallow에 대한 액세스 권한을 추가했습니다. 권한을 수락하면 응용 프로그램이 충돌합니다. 그리고 난 여기 android marshmallow의 연락처에 액세스 할 때 문제가 발생했습니다.

public class ContactsDisplay extends AppCompatActivity implements OnItemClickListener,FragmentDrawer.FragmentDrawerListener { 

     private static String TAG = ContactsDisplay.class.getSimpleName(); 

     private Toolbar mToolbar; 
     private FragmentDrawer drawerFragment; 

     Cursor phones; 

     List<String> name1 = new ArrayList<String>(); 
     List<String> phno1 = new ArrayList<String>(); 
     MyAdapter ma ; 
     Button select; 

     private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      //getActionBar().setDisplayShowTitleEnabled(false); 
      setContentView(R.layout.contacts_display); 
      mToolbar = (Toolbar) findViewById(R.id.toolbar); 
      ImageView img = (ImageView)findViewById(R.id.imageView10); 
      setSupportActionBar(mToolbar); 
      getSupportActionBar().setDisplayShowHomeEnabled(true); 

      drawerFragment = (FragmentDrawer) 
        getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
      drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); 
      drawerFragment.setDrawerListener(this); 

      // display the second navigation drawer view on app launch 
      displayView(0); 

      getAllContacts(this.getContentResolver()); 
      ListView lv= (ListView) findViewById(R.id.lv); 
      ma = new MyAdapter(); 
      lv.setAdapter(ma); 
      lv.setOnItemClickListener(this); 
      lv.setItemsCanFocus(false); 
      lv.setTextFilterEnabled(true); 
      // adding 
      select = (Button) findViewById(R.id.button1); 

      select.setOnClickListener(new OnClickListener() 
      { 

       @Override 
       public void onClick(View v) { 
        StringBuilder checkedcontacts= new StringBuilder(); 
        System.out.println(".............."+ma.mCheckStates.size()); 
        for(int i = 0; i < name1.size(); i++) 

        { 
         if(ma.mCheckStates.get(i)==true) 
         { 
          checkedcontacts.append(name1.get(i).toString()); 
          checkedcontacts.append("\n"); 

         } 
         else 
         { 
          System.out.println("Not Checked......"+name1.get(i).toString()); 
         } 


        } 

        Toast.makeText(ContactsDisplay.this, checkedcontacts,Toast.LENGTH_LONG).show(); 
       } 
      }); 

     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.menu_main, menu); 
      return true; 
     } 

     public void onItemClick(AdapterView<?> parent, View view, int position, 
           long id) { 

       ma.toggle(position); 
      } 




     public void getAllContacts(ContentResolver cr) { 

      int result = ContextCompat.checkSelfPermission(ContactsDisplay.this, Manifest.permission.READ_CONTACTS); 
      if (result == PackageManager.PERMISSION_GRANTED){ 

       phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
       contactsdisplay(); 

      } else { 

       requestForLocationPermission(); 
      } 
     } 

     private void requestForLocationPermission() 
     { 

      if (ActivityCompat.shouldShowRequestPermissionRationale(ContactsDisplay.this, Manifest.permission.READ_CONTACTS)) 
      { 
      } 
      else { 

       ActivityCompat.requestPermissions(ContactsDisplay.this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
      } 
     } 

     @Override 
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 
     { 
      switch (requestCode) { 
       case MY_PERMISSIONS_REQUEST_READ_CONTACTS: 
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
        { 
    getAllContacts(ContactsDisplay.this.getContentResolver());       
contactsdisplay(); 
        } 
        break; 
      } 
     } 

     public void contactsdisplay() { 

      phones.moveToFirst(); 
     do 
     { 
      String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      System.out.println(".................."+phoneNumber); 
      name1.add(name); 
      phno1.add(phoneNumber); 
     }while (phones.moveToNext()); 
     } 

     class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener 
     { private SparseBooleanArray mCheckStates; 
      LayoutInflater mInflater; 
      TextView tv1,tv; 
      CheckBox cb; 
      MyAdapter() 
      { 
       mCheckStates = new SparseBooleanArray(name1.size()); 
       mInflater = (LayoutInflater)ContactsDisplay.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 
      @Override 
      public int getCount() { 
       // TODO Auto-generated method stub 
       return name1.size(); 
      } 

      @Override 
      public Object getItem(int position) { 
       // TODO Auto-generated method stub 
       return position; 
      } 

      @Override 
      public long getItemId(int position) { 
       // TODO Auto-generated method stub 

       return 0; 
      } 

      @Override 
      public View getView(final int position, View convertView, ViewGroup parent) { 
       // TODO Auto-generated method stub 
       View vi=convertView; 
       if(convertView==null) 
        vi = mInflater.inflate(R.layout.row, null); 
       TextView tv= (TextView) vi.findViewById(R.id.textView1); 
       tv1= (TextView) vi.findViewById(R.id.textView2); 
       cb = (CheckBox) vi.findViewById(R.id.checkBox_id); 
       tv.setText("Name :"+ name1.get(position)); 
       tv1.setText("Phone No :"+ phno1.get(position)); 
       cb.setTag(position); 
       cb.setChecked(mCheckStates.get(position, false)); 
       cb.setOnCheckedChangeListener(this); 

       return vi; 
      } 
      public boolean isChecked(int position) { 
       return mCheckStates.get(position, false); 
      } 

      public void setChecked(int position, boolean isChecked) { 
       mCheckStates.put(position, isChecked); 
       System.out.println("hello..........."); 
       notifyDataSetChanged(); 
      } 

      public void toggle(int position) { 
       setChecked(position, !isChecked(position)); 
      } 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
             boolean isChecked) { 
       // TODO Auto-generated method stub 

       mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
      } 
     } 


     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 

      //noinspection SimplifiableIfStatement 
      if (id == R.id.action_settings) { 
       return true; 
      } 

      if(id == R.id.action_search){ 
       /*Toast.makeText(getApplicationContext(), vault_no, Toast.LENGTH_SHORT).show(); 
       return true;*/ 
       logout(); 
      } 

      if(id == R.id.action_settings) { 
       return true; 
      } 

      return super.onOptionsItemSelected(item); 
     } 

     private void logout(){ 
      //Creating an alert dialog to confirm logout 
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
      alertDialogBuilder.setMessage("Are you sure you want to logout?"); 
      alertDialogBuilder.setPositiveButton("Yes", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface arg0, int arg1) { 

          //Getting out sharedpreferences 
          SharedPreferences preferences = getSharedPreferences(ClickToLogin.SHARED_PREF_NAME, Context.MODE_PRIVATE); 
          //Getting editor 
          SharedPreferences.Editor editor = preferences.edit(); 

          //Puting the value false for loggedin 
          editor.putBoolean(ClickToLogin.LOGGEDIN_SHARED_PREF, false); 

          //Putting blank value to email 
          editor.putString(ProfileLogin.EMAIL_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.FULLNAME_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.MOBILE_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.POB_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.DOB_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.PIN_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.EMAIL_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.DOC_SHARED_PREF, ""); 
          editor.putString(ClickToLogin.YEAR_SHARED_PREF, ""); 
          editor.clear(); 
          //Saving the sharedpreferences 
          editor.commit(); 

          //Starting login activity 
          Intent intent = new Intent(ContactsDisplay.this, ProfileLogin.class); 
          startActivity(intent); 
         } 
        }); 

      alertDialogBuilder.setNegativeButton("No", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface arg0, int arg1) { 

         } 
        }); 

      //Showing the alert dialog 
      AlertDialog alertDialog = alertDialogBuilder.create(); 
      alertDialog.show(); 

     } 

     @Override 
     public void onDrawerItemSelected(View view, int position) { 
      displayView(position); 
     } 

     private void displayView(int position) { 
      Fragment fragment = null; 
      String title = getString(R.string.app_name); 
      switch (position) { 
       case 0: 
        /*fragment = new HomeFragment();*/ 
        title = "Work Details1"; 

        break; 

       case 1: 
        /*fragment = new ProfileFragment(); 
        title = getString(R.string.title_profile); 
        break;*/ 
        startActivity(new Intent(this, ContactsDisplay.class)); 
        return; 
       case 2: 

        startActivity(new Intent (this,Events.class)); 
        return; 
        /*fragment = new AboutFragment(); 
        title = getString(R.string.title_about); 
        break;*/ 
       case 3: 
        fragment = new MessagesFragment(); 
        title = getString(R.string.title_messages); 
        break; 

       case 4: 
        fragment = new VideoFragment(); 
        title = getString(R.string.title_video); 
        break; 
       case 5: 
        fragment = new GalleryFragment(); 
        title = getString(R.string.title_gallery); 
        break; 
       case 6: 
        fragment = new GalleryFragment(); 
        title = "Gallery"; 
        break; 

       case 7: 
        fragment = new EventsFragment(); 
        title = getString(R.string.title_events); 
        break; 

       default: 
        break; 
      } 

      if (fragment != null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.container_body, fragment); 
       fragmentTransaction.commit(); 

       // set the toolbar title 
       getSupportActionBar().setTitle(title); 
      } 
     } 

     @Override 
     public void onBackPressed() { 

      finish(); 
      Intent intent = new Intent(ContactsDisplay.this, DocUpload.class); 

      intent.setAction(Intent.ACTION_MAIN); 
      intent.addCategory(Intent.CATEGORY_HOME); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      startActivity(intent); 

     } 

    } 

가 로그 캣

06-13 05:37:22.000 11581-11581/com.example.miisky E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: com.example.miisky, PID: 11581 
                  java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.miisky/com.example.miisky.ContactsDisplay}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.moveToNext()' on a null object reference 
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3699) 
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                  at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:148) 
                  at android.app.ActivityThread.main(ActivityThread.java:5417) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                 Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.database.Cursor.moveToNext()' on a null object reference 
                  at com.example.miisky.ContactsDisplay.contactsdisplay(ContactsDisplay.java:199) 
                  at com.example.miisky.ContactsDisplay.onRequestPermissionsResult(ContactsDisplay.java:190) 
                  at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553) 
                  at android.app.Activity.dispatchActivityResult(Activity.java:6432) 
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)  
                 at android.app.ActivityThread.-wrap16(ActivityThread.java)  
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)  
                 at android.os.Handler.dispatchMessage(Handler.java:102)  
                 at android.os.Looper.loop(Looper.java:148)  
                 at android.app.ActivityThread.main(ActivityThread.java:5417)  
                 at java.lang.reflect.Method.invoke(Native Method)  
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

답변

0

내 코드의 문제는 AppcompatActivity..i는

그래서이 마지막 코드입니다 ... 코드 연락처를 액세스하는 동안 마시 멜로에 대한 액세스 권한이 요구되는 미세 ..Even을 실행 Actitvity..Now하는 AppcompatActivity 변경되었습니다 ..

public class DisplayContact extends Activity implements OnItemClickListener{ 

    //ArrayList to store name and phone number 
    List<String> name1 = new ArrayList<String>(); 
    List<String> phno1 = new ArrayList<String>(); 
    MyAdapter ma ; 
    Button select; 
    Cursor phones; 

    private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().setDisplayShowTitleEnabled(false); 
     setContentView(R.layout.display); 


     getAllContacts(this.getContentResolver()); 
     ListView lv= (ListView) findViewById(R.id.lv); 
     ma = new MyAdapter(); 
     lv.setAdapter(ma); 
     lv.setOnItemClickListener(this); 
     lv.setItemsCanFocus(false); 
     lv.setTextFilterEnabled(true); 
     // adding 
     select = (Button) findViewById(R.id.button1); 
     select.setOnClickListener(new View.OnClickListener() 
     { 

      @Override 
      public void onClick(View v) { 
       StringBuilder checkedcontacts= new StringBuilder(); 

       for(int i = 0; i < name1.size(); i++) 

       { 
        if(ma.mCheckStates.get(i)==true) 
        { 
         checkedcontacts.append(name1.get(i).toString()); 
         checkedcontacts.append(phno1.get(i).toString()); 
         checkedcontacts.append("\n"); 

        else 
        { 

        } 
       } 
       Toast.makeText(DisplayContact.this, checkedcontacts, Toast.LENGTH_LONG).show(); 

      } 
     }); 

    } 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 
     ma.toggle(arg2); 
    } 

    public void getAllContacts(ContentResolver cr) { 

     int result = ContextCompat.checkSelfPermission(DisplayContact.this, Manifest.permission.READ_CONTACTS); 
     if (result == PackageManager.PERMISSION_GRANTED){ 

      phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
      contactsdisplay(); 

     } else { 

      requestForLocationPermission(); 
     } 
    } 

    private void requestForLocationPermission() 
    { 

     if (ActivityCompat.shouldShowRequestPermissionRationale(DisplayContact.this, Manifest.permission.READ_CONTACTS)) 
     { 
     } 
     else { 

      ActivityCompat.requestPermissions(DisplayContact.this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 
    { 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_READ_CONTACTS: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
       { 
        getAllContacts(DisplayContact.this.getContentResolver()); 
        contactsdisplay(); 
       } 
       break; 
     } 
    } 

    public void contactsdisplay() { 

     //Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
     while (phones.moveToNext()) 
     { 
      String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      System.out.println(".................."+name+ "" +phoneNumber); 
      name1.add(name); 
      phno1.add(phoneNumber); 
     } 

     phones.close(); 
    } 

    class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener 
    { private SparseBooleanArray mCheckStates; 
     LayoutInflater mInflater; 
     TextView tv1,tv; 
     CheckBox cb; 
     MyAdapter() 
     { 
      mCheckStates = new SparseBooleanArray(name1.size()); 
      mInflater = (LayoutInflater)DisplayContact.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 
     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return name1.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 

      return 0; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      View vi=convertView; 
      if(convertView==null) 
       vi = mInflater.inflate(R.layout.row, null); 
      tv= (TextView) vi.findViewById(R.id.contact_name); 
      tv1= (TextView) vi.findViewById(R.id.phone_number); 
      cb = (CheckBox) vi.findViewById(R.id.checkBox_id); 
      tv.setText("Name :"+ name1.get(position)); 
      tv1.setText("Phone No :"+ phno1.get(position)); 
      cb.setTag(position); 
      cb.setChecked(mCheckStates.get(position, false)); 
      cb.setOnCheckedChangeListener(this); 

      return vi; 
     } 
     public boolean isChecked(int position) { 
      return mCheckStates.get(position, false); 
     } 

     public void setChecked(int position, boolean isChecked) { 
      mCheckStates.put(position, isChecked); 
     } 

     public void toggle(int position) { 
      setChecked(position, !isChecked(position)); 
     } 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
            boolean isChecked) { 
      // TODO Auto-generated method stub 

      mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
     } 
    } 

    @Override 
    public void onBackPressed() { 

     finish(); 
     Intent intent = new Intent(DisplayContact.this, ProfileDisplay.class); 

     intent.setAction(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_HOME); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 

    } 
} 
1
입니다 .. 내가 사용한 권한 코드 ... 내가 wrong..here을려고하는 코드입니다 몇 가지 중 하나가 말해 줄 수 확실하지 않다

필요한 권한을 확인한 getAllContacts()를 호출하고 권한이 이미 부여 된 경우 연락처 목록을 가져옵니다. 코드에 문제가 있다면 권한이 없으면 요청할 것입니다. 이제는 사용자가 허용하거나 거부 할 때 다시 onRequestPermissionsResult()에서도 동일한 메소드 getAllContacts()를 호출해야합니다. 현재 사용자가 허용하지만 사용자는 아직 연락처를 가져 오지 않았으며 직접 읽지 않습니다.

은 getAllContacts() onRequestPermissionsResult 내부도()를 호출 즉, 당신이 getAllContacts()를 호출하고 이미 허가 커서 폰 값을 가질 것이다 부여가있을 때

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){ 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_READ_CONTACTS: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
       { 
        getAllContacts(ContactsDisplay.this.getContentResolver()); 
        contactsdisplay(); 
       }else{ 
        //Show a dialog with explanation why you want contacts permission and ask for permission again or else simply display appropriate error or alert message. 
       } 
       break; 
     } 
    } 

그래서 먼저 설명하기를 추가합니다. 그러나 권한이 없으면 권한을 요청하는 대화 상자를 표시하고 사용자가 직접 contactdisplay()를 잘못 호출하면 허용합니다. 사용자가 권한을 부여한 후 getAllContacts()를 먼저 호출 한 다음 contactsdisplay()를 호출해야합니다.

+0

난이 표시되지 아니 .. 지금은 오류가 gone..but 한 내가 아니에요 .. 빈 페이지를 표시 permission..just에 대한 –

+0

을 요구하지됩니다 하시다면 code..it에 따라 변경 권한 대화 상자를 얻는 중 .. 문제가 될 수있는 것은 무엇입니까? –

+0

죄송하지만 getAllContacts (this.getContentResolver())를 호출해야합니다. 당신도 이전에했던 것처럼 onCreate에서. 따라서 귀하의 흐름이 완료되고 권한 대화 상자가 표시됩니다. 따라서 getAllContacts() 메소드는 onCreate()와 onRequestPermissionsResult()에서 호출 될 것입니다. –