2017-11-21 18 views
-2

내 응용 프로그램을 시험 중입니다.하지만 휴대 전화에 apk를 처음 설치하면 권한이 빨리 표시되고 충돌이 발생하며 권한을 다시 표시하고 확인 및 확인을 확인합니다.권한을 요청하기 전에 시작시 응용 프로그램이 다운 됨

어떻게 방지 하시겠습니까? 일부 사용자는 앱을 다시 시작하지 않기 때문에! 당신

감사합니다 이건 내 권한입니다 : 프로젝트에 대해

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> 

정보 (Probleme은 단지 오디오 녹음에서 파일에 대한 액세스입니다) :

의 minSdkVersion 15
targetSdkVersion을 26
compileSdkVersion 26

고맙습니다.

오류 로그에서

이 오류 :

11-21 17:46:17.298 24237-24647/com.geniusly.myapp E/Message_Register: DONE 
11-21 17:46:17.476 24237-24237/com.geniusly.myapp E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.geniusly.myapp, PID: 24237 
       java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]:requestPermissions:, request=200, result=0, data=null} to activity {com.geniusly.myapp/tin.subtil.HomeActivityNew}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4481) 
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4524) 
        at android.app.ActivityThread.-wrap22(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1691) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6692) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 
        Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
        at tin.subtil.HomeActivityNew.onRequestPermissionsResult(HomeActivityNew.java:298) 
        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7404) 
        at android.app.Activity.dispatchActivityResult(Activity.java:7230) 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4477) 
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4524)  
        at android.app.ActivityThread.-wrap22(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1691)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:154)  
        at android.app.ActivityThread.main(ActivityThread.java:6692)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  

편집 : (에서 onCreate)

다음
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home_new); 

    int requestCode = 200; 
    if (Build.VERSION.SDK_INT >= 23) { 
     requestPermissions(permissions, requestCode); 
    } 

    init(); 
    myHandler = new Handler(); 
    slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.HIDDEN); 
    SetupToolbar(); 
    SetupPager(); 
    SetupDrawer(); 
    iv_playpause.setTag("pause");  
    MobileAds.initialize(getApplicationContext(), 
    getResources().getString(R.string.admov_id)); 
    AdView mAdView = (AdView) findViewById(R.id.adView); 
    AdRequest adRequest = new AdRequest.Builder().build(); 
    mAdView.loadAd(adRequest); 
} 

RequestPermissions에서

private boolean permissionToRecordAccepted = false; 
private boolean permissionToWriteAccepted = false; 
private String[] permissions = {"android.permission.RECORD_AUDIO", "android.permission.WRITE_EXTERNAL_STORAGE"}; 

:

이 내 코드입니다

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case 200: 
     if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
      permissionToRecordAccepted=true; 
     } 
     if(grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED){ 
      permissionToWriteAccepted=true; 
     } 

     break; 
    } 
    if (!permissionToRecordAccepted) HomeActivityNew.super.finish(); 
    if (!permissionToWriteAccepted) HomeActivityNew.super.finish(); 
} 
+0

당신의 로그를 확인하십시오 당신은 몇 가지 코드와 충돌 – diegoveloper

+0

를 넣어, 오류의 java.lang.ArrayIndexOutOfBoundsException가 배열 –

+1

의 스택 트레이스를 게시 할 수 귀하의 초기 활성 코드 –

답변

1

모든 Android 버전에서 권한 선언에 설명 된대로 앱은 앱 목록에 필요한 일반 및 위험 권한을 Android의 모든 버전에서 선언해야합니다. 그러나 해당 선언의 효과는 시스템 버전 및 앱의 대상 SDK 레벨에 따라 다릅니다.

기기가 Android 5.1 이하 또는 앱의 타겟 SDK가 22 이하인 경우 : 위험한 매니페스트에서 권한을 부여받은 경우 사용자는 앱을 설치할 때 권한을 부여해야합니다. 권한을 부여하지 않으면 시스템에서 앱을 전혀 설치하지 않습니다. 기기가 Android 6.0 이상을 실행 중이며 앱의 대상 SDK가 23 이상인 경우 : 앱은 매니페스트에 권한을 나열해야하며 앱이 실행되는 동안 필요한 위험한 권한을 각각 요청해야합니다. 사용자는 각 권한을 부여하거나 거부 할 수 있으며 사용자가 권한 요청을 거부하더라도 제한된 기능으로 앱을 계속 실행할 수 있습니다. 참고 : Android 6.0 (API 레벨 23)부터는 사용자가 더 낮은 API 수준을 타겟팅하는 경우에도 언제든지 모든 앱에서 권한을 취소 할 수 있습니다. 앱이 어떤 API 레벨을 목표로하는지에 관계없이 필요한 권한이 누락 된 경우 앱이 제대로 작동하는지 테스트해야합니다. java.lang.ArrayIndexOutOfBoundsException :

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.yourlayout); 

    int permission = ContextCompat.checkSelfPermission(this, 
      Manifest.permission.RECORD_AUDIO); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     Log.i(TAG, "Permission to record denied"); 
     makeRequest(); 
    } 
} 

protected void makeRequest() { 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.RECORD_AUDIO}, 
      RECORD_REQUEST_CODE); 
} 



Next, implement the onRequestPermissionsResult() method so that it reads as follows: 




@Override 
public void onRequestPermissionsResult(int requestCode, 
            String permissions[], int[] 
grantResults) { 
switch (requestCode) { 
    case RECORD_REQUEST_CODE: { 

     if (grantResults.length == 0 
       || grantResults[0] != 
     PackageManager.PERMISSION_GRANTED) { 

      Log.i(TAG, "Permission has been denied by user"); 
     } else { 
      Log.i(TAG, "Permission has been granted by user"); 
     } 
     return; 
    } 
} 
}                        
+0

답장을 보내 주셔서 감사합니다. 그렇다면 내가 매니페스트를 추가하여 권한 요청을 코딩해야한다는 것을 이해한다면? 감사합니다. – AmenzO

+0

예 @AmenzO 귀하의 기기가 마쉬 멜로우 이상을 타겟팅하는 경우 권한 요청을 요청하여 권한을 요청해야합니다. 문제를 해결할 수 있다면 환영받을 수 있습니다. –

+0

정말 고마워요. , 나는 그것에 대해 더 많이 배우려고 노력할 것이고 선택의 여지가 없다. – AmenzO