2015-12-13 1 views
0

После прочтения документов Android я решил поиграть и «прочитать sms-сообщения с моего устройства».Android 6.0 (Marshmallow) Отказ от разрешений и отсутствие диалога запроса на предоставление прав доступа пользователю

Однако после установки разрешений в манифесте и написания кода для запроса разрешений в коде позади (java), а после установки точки останова на RequestPermission(), я вижу, что мое приложение выходит из строя, потому что «Permission denied».

Почему я получаю разрешение на отказ, когда я объявил все, что сообщили мне документы, чтобы объявить и, также внедрили эту вещь, когда вы получаете ОС, чтобы попросить пользователя предоставить или запретить разрешение (что даже не произойдет - это не дает мне диалог, чтобы предоставить или запретить разрешения - мое приложение просто падает до его появления!)

Как я могу выяснить, что происходит? Как я могу спросить пользователя для разрешения на [специально] READ_SMS разрешение?

Обратите внимание, что я бил головой о стол, пытаясь исправить это для дней, поэтому код здесь - последний код, который у меня есть, однако было около 20 (полных) переписываний. Поэтому, если что-то отсутствует, оно, возможно, уже было там, но было удалено, потому что оно не работало или было удалено, чтобы устранить неполадки, чтобы увидеть, что работает, чего нет.

манифеста:

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
     <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
     <uses-permission android:name="android.permission.READ_SMS" /> 
     <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
     <uses-feature 
      android:name="android.hardware.telephony" 
      android:required="true"> 
     </uses-feature> 
     <grant-uri-permission android:path="content://sms/" 
      android:pathPattern=".*" 
      android:pathPrefix="\"/> 
     <activity 
      android:name=".Main" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

Main.java (OnCreate (...)):

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

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Testing Snackbar", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    RequestPermission(this); 
} 

Main.java (методы разрешения):

private static final int MY_PERMISSIONS_REQUEST_READ_SMS = 226; 

protected void RequestPermission(Activity activity) 
{ 
    if(ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) 
    { 
     if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_SMS)) { 
      return; 
     } 
     else 
     { 
      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.READ_SMS 
      }, MY_PERMISSIONS_REQUEST_READ_SMS); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 
{ 
    switch(requestCode) 
    { 
     case MY_PERMISSIONS_REQUEST_READ_SMS: 
     { 
      if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
      { 
       MessageAdapter messageAdapter = new MessageAdapter(GetMessages()); 
       RecyclerView recList = (RecyclerView) findViewById(R.id.messagesList); 
       recList.setAdapter(messageAdapter); 

       // CardView List 
       LinearLayoutManager llm = new LinearLayoutManager(this.getApplicationContext()); 
       llm.setOrientation(LinearLayoutManager.VERTICAL); 
       recList.setLayoutManager(llm); 
      } 
      else 
      { 
       return; 
      } 

      return; 
     } 
    } 
} 
+0

Попробуйте это, возможно, вам помогут: -http: //stackoverflow.com/a/41221852/5488468 он работает для меня –

ответ

2

одном месте следует исправить:

if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_SMS)) { 
      return; 
     } 

здесь вы просто возвращаетесь, в то время как на самом деле вам нужно показать rationalle, почему вам нужно это разрешение, а затем запросите его. Обычным aproach является использование Snackbar или диалога или просто сразу же позвонить ActivityCompat.requestPermissions( - по крайней мере, для целей тестирования.

[править]

Snackbar.make(activity, R.string.rationaleStringId, Snackbar.LENGTH_INDEFINITE) 
      .setAction(android.R.string.ok, new View.OnClickListener() { 
      @Override 
      @TargetApi(Build.VERSION_CODES.M) 
      public void onClick(View v) { 
       ActivityCompat.requestPermissions(activity, new String[] {Manifest.permission.READ_SMS}, MY_PERMISSIONS_REQUEST_READ_SMS); 
      } 
      }).show(); 
+0

спасибо. Я просто написал то, что было написано в документации. Понятия не имею, я должен был вернуться к обоснованию. Не могли бы вы дать мне небольшой выбор? Я все еще немного новичок здесь (для Android) и немного смущен. – username

+0

@username see my edit – marcinj

+0

Что на самом деле означает 'R.string.rationaleStringId'? Если я добавлю его как строку в файле strings.xml, это не сработает.Если я просто оставлю это там, я не уверен, что с ним делать. У меня уже есть закусочная в моем приложении и передать строку в качестве аргумента в том же месте, и она работает, но этот код не работает в методе расширения (RequestPermission) – username

1

Ваших <uses-permission> элементов находятся в неправильном месте, как это <uses-feature> элемента. Они выходят за пределы элемента <application>, как прямые дети корня <manifest>.

Также удалите элемент <grant-uri-permission>. Не только это не в правильном месте, но вы не имеете правильное место для него, так как это происходит только в детстве элемента <provider>.