2016-11-17 13 views
0

Я разрабатываю приложение, необходимое для доступа к контактам в телефоне. этот метод выполняется внутри потока. Но когда приложение запускается в первый раз, он сбой и говорит, что в качестве ошибки требуется android.permission.READ_CONTACTS или android.permission.READ_CONTACTS. как только нажмете на кнопку ОК в диалоговом окне всплывающего окна. он перезапускает его самостоятельно, прося разрешения и отлично работает. В некоторых телефонах он не показывает никаких ошибок или диалогового окна.Android Прочитать контакты Разрешение на работу не работает

вот код внутри фрагмента по методу onCreateView, чтобы проверить, является ли разрешение уже было выдано

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 
       == PackageManager.PERMISSION_GRANTED) { 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        getContacts(); 
       } 
      }; 
      Thread thread = new Thread(r); 
      thread.start(); 
     }else{ 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { 
        Toast.makeText(this, "Read contacts permission is required to function app correctly", Toast.LENGTH_LONG) 
          .show(); 
       } 
       requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS); 
      } 
     } 

Вот onRequestPermissionsResult метод.

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode){ 
      case REQUEST_READ_CONTACTS : 
       Runnable r = new Runnable() { 
        @Override 
        public void run() { 
         getContacts(); 
        } 
       }; 
       Thread thread = new Thread(r); 
       thread.start(); 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

Это код AndroidManifest.xml.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.shan.chathuranga.smsscheduler"> 

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

</manifest> 

Что я делаю неправильно. отлично работает в нижнем зефире. requestPermissions способ.

Вот ссылка на репозиторий https://[email protected]/chathurangaJ/sms-scheduler.git Я застрял в этом в течение 2 недель, пожалуйста, помогите.

Я пытаюсь его отладить. Эта ошибка будет получена, как только приложение достигнет

+0

Попробуйте этот ответ http://stackoverflow.com/ Вопросы/40626721/onrequestpermissionsresult-grant-results-always-1/40628014 # 40628014 –

ответ

0

Если вы открываете меню и долго нажимаете свое приложение, то показываете опции 1.app info и 2.uninstall, просто перетащите приложение в информацию о приложении, а затем увидите хранилище и использование данных и т. д., затем см. параметр разрешений open hit и проверить наличие контакта или нет, если есть контакт, просто включите и запустите приложение, вы получите контакт, иначе в противном случае у вашего кода может возникнуть проблема, и если у вас есть какие-либо разрешения подробно, пожалуйста, проверьте ссылку ниже, https://developer.android.com/training/permissions/requesting.html

0
private boolean checkPermission(){ 
     if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_CONTACTS)) { 
       Toast.makeText(getActivity(), "Contact read permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); 
       Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getActivity().getPackageName(), null)); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivityForResult(intent, 789); 
       return false; 
      }else { 
       requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 123); 
       return false; 
      } 
     } 
     return true; 
    } 

использовать этот метод для проверки запуска разрешения времени на уровне API 23 или выше, он покажет у оу диалог для разрешения во время выполнения, если пользователь может разрешить, то все нормально, если отрицать, то вы должны перепроверить разрешения снова, чтобы предотвратить от аварии приложения,

перед использованием этого кода, пожалуйста, добавьте Контакт READ разрешения, как вы уже добавили , надеюсь, это вам поможет.

ПРИМЕЧАНИЕ

  1. В AppCompatActivity использовать метод ActivityCompat.requestpermissions
  2. В фрагменте поддержки v4 вы должны использовать requestpermissions
  3. Поймайте, если вы звоните AppcompatActivity.requestpermissions в ваш фрагмент, тогда обратный вызов придет к активности, а не фрагменту

4.Make обязательно позвоните super.onRequestPermissionsResult от деятельности в onRequestPermissionsResult.

+0

Ну, я использую этот метод в фрагменте, и я использую метод 'requestpermissions' , Это не работает. просто чтобы убедиться, что я даже использую 'AppcompatActivity.requestpermissions', чтобы увидеть, открывается ли диалоговое окно. Но он все еще не работает. Я использую разрешение runtime для отправки sms в приложении, которое отлично работает, но это. –

+0

прошу до конца от второго ответа ........ –

0

это ваш метод и работая отлично, я проверил его, попробуйте сделать то же самое и позвоните по телефону onCreateView метод.

private void check(){ 


     if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) 
       == PackageManager.PERMISSION_GRANTED) { 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
//     getContacts(); 
       } 
      }; 
      Thread thread = new Thread(r); 
      thread.start(); 
     }else{ 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { 
        Toast.makeText(getActivity(), "Read contacts permission is required to function app correctly", Toast.LENGTH_LONG).show(); 
       }else { 
        ActivityCompat.requestPermissions(getActivity(), 
          new String[]{Manifest.permission.READ_CONTACTS}, 
          1);    } 

      } 
     } 


    } 

и убедитесь, что у вас есть разрешение применять в использовании AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xyz"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

И называют это из:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_contact, container, false); 

     check(); 


     return view; 
    } 
+0

Спасибо за ответ, что вы заменили 'requestPermissions'' ActivityCompat.requestPermissions'I've попробуйте это тоже. не повезло. –