2016-05-06 8 views
1

Ich habe eine App entwickelt, auf Nexus 7 installiert Android 5, die Liste der Dateien in einem Verzeichnis auf SD-Karte zeigt. Nach dem Upgrade auf Android 6 kann nicht mehr auf die SD-Karte zugegriffen werden!upgrade Nexus 7 auf Android 6, meine App kann nicht mehr auf SD-Karte zugreifen

Hier mein Code:

File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
    String ProjectPath = f.getPath(); 
    Log.w("path",ProjectPath); 
    File list[]=f.listFiles(); 
    if(list.length>0) { 
     for (int i = 0; i < list.length; i++) 
      Log.w("path", list[i].getName()); 
    } 

folgenden Berechtigungen auch hinzugefügt:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 

Logcat

E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.behy.myapplication, PID: 13472 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.behy.myapplication/com.behy.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
     Caused by: java.lang.NullPointerException: Attempt to get length of null array 
     at com.behy.myapplication.MainActivity.onCreate(MainActivity.java:21) 
     at android.app.Activity.performCreate(Activity.java:6251) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
     at android.app.ActivityThread.-wrap11(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5417)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

EDIT 1
Nach File list[]=f.listFiles();, list ist null!

EDIT 2
ich meinen Code habe wie folgt korrigiert und es funktioniert für Android.M sowie frühere Versionen:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.w("path","ver: " + android.os.Build.VERSION.SDK_INT); 
     if (android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { 
      if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) 
       readFile(); 
      else 
       requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 2909); 
     } 
     else 
      readFile(); 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String permission[], int[] grantesult){ 
     if(requestCode == 2909){ 
      if(grantesult.length>0 && grantesult[0]==PackageManager.PERMISSION_GRANTED) 
       readFile(); 
     } 
    } 
    private void readFile(){ 
      File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
      String ProjectPath = f.getPath(); 
      Log.w("path",ProjectPath); 
      File list[]=f.listFiles(); 
      if(!f.exists())return; 
      for(File file:f.listFiles()) 
       Log.w("path", file.getName()); 
    } 
} 
+1

dieser Fehler verursacht durch Nullpointer Prüfung dieses ref: http://stackoverflow.com/questions/33495022/app-crashes-on-android-6-0 -launch-logcat-included-new-developer? rq = 1 –

+0

korrekt, in android 6, 'listFiles()' cusses nullpointerexception error aber warum in android 6. Darüber hinaus durch die Anwendung von Änderungen in der Verknüpfung vorgeschlagen das Problem nicht gelöst – Behy

Antwort

1

In API 23 gibt es eine Option für die Runtime-Erlaubnis. Sie können überprüfen, ist die Berechtigung mit diesem Code gewährt.

 if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){ 
    //place your code here 
     }else{ 
//request for runtime permission 
       } 

für mehr über Laufzeit Erlaubnis lesen this

+0

Sie sind richtig, der Grund ist die neue dynamische Erlaubnis von Android 6 – Behy

Verwandte Themen