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); 

     } 

    } 

はlogcat

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を変更しました私は空白のページを表示permission..justを求めていませんウルcode..itに応じて変更されています。..

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()を呼び出しています。権限がすでに与えられている場合は、連絡先のリストを取得しています。あなたのコードの問題は、あなたが権限を持っていないときに、あなたがそれを求めていることです。したがって、ユーザーが許可または拒否すると、同じメソッドgetAllContacts()をonRequestPermissionsResult()からも呼び出す必要があります。現在、そのユーザーは許可されていますが、あなたはまだ連絡先を取り出しておらず、直接読んでいません。

あなたがgetAllContactsを(呼び出すときに、最初に説明するのもonRequestPermissionsResult内部の()の呼び出し()すなわち

@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; 
     } 
    } 

あなたgetAllContactsを追加)、あなたはすでにあなたのカーソルの電話が値を持つことになります許可を付与しています。しかし、あなたが権限を持っていない場合は、アクセス権を要求するダイアログを表示し、ユーザがあなたが間違っているcontactsdisplay()を直接呼び出すことを許可した場合。あなたはあなたに許可を与えたユーザーとして最初にgetAllContacts()を呼び出してからcontactsdisplay()を呼び出す必要があります。

+0

... –

+0

全くそれが今エラーは私はないですgone..butた..表示されませんされませんでした許可のダイアログが表示されます。何が問題なのでしょうか? –

+0

申し訳ありませんが、getAllContacts(this.getContentResolver())を呼び出す必要があります。あなたも以前と同じように、作成してください。あなたの流れは完了し、あなたは許可のダイアログで表示されます。したがって、あなたのgetAllContacts()メソッドはonCreate()とonRequestPermissionsResult()の両方から呼び出されます。 –

関連する問題