2017-06-21 23 views
0

我試圖從API模擬器23訪問聯繫人,但在運行時無法檢查權限。這裏是代碼在運行時檢查權限不顯示

我在清單添加

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

content_main`

<ListView 
    android:id="@+id/contact_names" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:layout_marginBottom="16dp" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    android:layout_marginTop="16dp" 
    android:scrollbars="vertical" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintHorizontal_bias="0.0" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    /> 

contact_detail.xml`

<TextView 
    android:id="@+id/name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    tools:text="TextView"/> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private static final String TAG = "MainActivity"; 
private ListView contactNames; 
private static final int REQUEST_CODE_READ_CONTACTS = 1; 
private static boolean READ_CONTACTS_GRANTED = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    contactNames = (ListView) findViewById(R.id.contact_names); 
    int hasReadContactPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS); 
    Log.d(TAG, "onCreate: checkSelfPermission "+ hasReadContactPermission); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.d(TAG, "fab onClick: starts"); 
      String[] projection={ContactsContract.Contacts.DISPLAY_NAME_PRIMARY}; 
      ContentResolver contentResolver = getContentResolver(); 
      Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, 
        projection, 
        null, 
        null, 
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY); 

      if(cursor!=null){ 
       List<String> contacts=new ArrayList<String>(); 
       while (cursor.moveToNext()){ 
        contacts.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
       } 
       cursor.close(); 
       ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this,R.layout.contact_detail,R.id.name,contacts); 
       contactNames.setAdapter(adapter); 
      } 
      Log.d(TAG, "fab onClick: ends"); 
     } 
    }); 
    Log.d(TAG, "onCreate: ends"); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    Log.d(TAG, "onRequestPermissionsResult: starts"); 
    switch (requestCode){ 
     case REQUEST_CODE_READ_CONTACTS:{ 
      //if request canclled then ResultArray is Empty 
      if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
       //permission granted,do the contacts related task you need to do 
       Log.d(TAG, "onRequestPermissionsResult: permission granted"); 
       READ_CONTACTS_GRANTED = true; 
      }else { 
       //permission denied 
       //disabled the functionalities that depends on this permission 
       Log.d(TAG, "onRequestPermissionsResult: permission refused"); 
      } 
     } 
    } 
    Log.d(TAG, "onRequestPermissionsResult: ends"); 
} 

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

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

    return super.o`enter code here`nOptionsItemSelected(item); 
} 

}

每當我點擊浮動操作按鈕應用程序崩潰。

+0

你只是檢查燙髮ission,如果沒有給予權限,你打電話去獲得許可? –

+0

[不幸的是,MyApp已停止。我怎樣才能解決這個問題?](https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this) –

回答

0

如果你沒有返回false許可,則請求權限

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

然後它會顯示彈出式窗口。

0

試試這個處理運行時權限

在OnCreate中添加此代碼()方法

String permission = Manifest.permission.READ_CONTACTS; 
int grant = ContextCompat.checkSelfPermission(this, permission); 
if (grant != PackageManager.PERMISSION_GRANTED) { 
    String[] permission_list = new String[1]; 
    permission_list[0] = permission; 
    ActivityCompat.requestPermissions(this, permission_list, 1); 
} 

現在處理這種

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
            @NonNull int[] grantResults) { 
super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
if (requestCode == 1) { 
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
             Log.d(TAG, "onRequestPermissionsResult: permission granted"); 
      READ_CONTACTS_GRANTED = true; 


    } else { 
     Toast.makeText(AccountClass.this,"permission not granted", Toast.LENGTH_SHORT).show(); 
    } 
} 

許可結果}

0

您需要先申請燙髮ission使用的onClick裏面下面的例子代碼 -

if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, 
       REQUEST_CODE_ASK_PERMISSIONS); 
     return; 
    } 
    insertDummyContact(); 

您可以瞭解更多關於它從here

0

使兩種方法,並在你的工廠的點擊檢查版本(地方你onClickListener這裏面調用)

if(Build.VERSION.SDK_INT >= 21){ 
//check for permission 
    if(!checkPermissionForContact()){ 
    //raise permission dialog 
    requestPersmissionForContacts(); 
    return; 
    } 
} 

兩種方法是:

public boolean checkPermissionForContact(){ 
    int result = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS); 
    if(result == PackageManager.PERMISSION_GRANTED){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

public void requestPersmissionForContacts(){ 
    if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)){ 
     Toast.makeText(MainActivity.this, "Contact Reading Permission needed. Please allow in App Settings for addition functionality.",Toast.LENGTH_LONG).show(); 
    }else { 
     ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, CONTACTS_PERMISSION_REQUEST_CODE); 
    } 
} 
+0

它的工作,但你能解釋一下嗎?並感謝這一點。 –

+0

你能告訴我在哪裏可以學習像你這樣的Android開發嗎?你有任何網站或博客嗎? –

+0

接受答案,如果它幫助.. :) – Ashwani