2016-11-17 23 views
0

私は電話機の連絡先にアクセスする必要があるアプリケーションを開発しています。このメソッドはスレッド内で実行されます。しかし、アプリが初めて起動したときにクラッシュし、android.permission.READ_CONTACTSまたはandroid.permission.READ_CONTACTSがエラーとして要求されます。エラーが発生したら[OK]を押すとすぐにダイアログが表示されます。それは許可を求める自己を再起動し、正常に動作します。一部の携帯電話では、エラーやダイアログボックスが表示されません。Androidアドレスを読み取る実行時アクセス許可が動作しない

ここで許可が既に

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

を付与されているかどうかを確認するためにonCreateView法上のフラグメント内のコードここで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

質問/ 40626721/onrequestpermissionsresult-grant-results-always-1/40628014#40628014 –

答えて

0

開いているメニューを長く押してアプリを長く押すと、1.app infoと2.uninstallオプションが表示され、アプリ情報にアプリをドラッグすると、ストレージとデータの使用状況が表示されます連絡先がある場合は連絡先があるかどうかを確認する連絡先がある場合は連絡先を取得するか、そうでない場合はコードに問題がある可能性があります。詳しくは、Yが表示されます、リンクの下にAPIレベル23以上、 のための実行時のアクセス許可をチェックする 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; 
    } 

使用この方法をご確認ください。あなたが既に許可している場合は、実行時に許可のダイアログボックスを表示します。ユーザーが許可していればすべてOKです。次に、アプリケーションのクラッシュを防ぐために再びアクセス許可を再確認する必要があります。。 うまくいけばそれはあなたを助けるでしょう。

NOTE

  1. AppCompatActivityでは、この方法にActivityCompat.requestpermissionsはあなたがAppcompatActivity.requestpermissionsを呼び出す場合
  2. キャッチがあるrequestpermissionsを使用する必要がありv4のサポートフラグメントで
  3. を使用あなたのフラグメントは、コールバックは、フラグメントではなく、アクティビティに来るでしょう
  4. アクティビティの onRequestPermissionsResultから super.onRequestPermissionsResultを呼び出してください

4.Make。

+0

このメソッドをフラグメントで使用しています。私は 'requestpermissions'メソッドを使用しました。動いていない。ちょうど私が 'AppcompatActivity.requestpermissions'を使ってダイアログボックスがポップアップしているかどうかを確かめてください。しかし、それはまだ動作していません。私は動作するアプリケーションでSMSを送信するためのランタイムアクセス許可を使用していますが、これはうまく動作します。 –

+0

第2の回答から.......まで –

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

      } 
     } 


    } 

、あなたが

<?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> 

をのAndroidManifest.xmlを使用許可を適用してから、それを呼び出す持っていることを確認する:この回答http://stackoverflow.com/を試してみてください

@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'に置き換えました。私もそれを試してみました。運がない。 –

関連する問題