2017-08-08 3 views
0

Ich versuche, den internen Speicherpfad eines Android-Geräts zu erhalten.Environment.getExternalStorageDirectory() return null

Da die meisten Geräte spät interne Speicherpfad mit Environment.getExternalStorageDirectory().getPath(); zurückgeben, so verwende ich dies um den Pfad zu bekommen.

Jedes Ding funktioniert gut, außer dass, wenn ich Environment.getExternalStorageDirectory().getPath(); von einer Nicht-Aktivitätsklasse anrufe, es null zurückgibt, während, wenn ich es von einer Aktivitätsklasse rufe, es den korrekten Pfad zurückgibt.

Ich habe versucht, andere Beiträge zu suchen, konnte aber nichts nützliches finden.

Jede Hilfe wäre wirklich dankbar.

EDIT:

if(getExtSdCardPath(con)!=null) 
    { path=getExtSdCardPath(con); 

     if(new File(path).getPath().equal(Environment.getExternalStorageDirectory().getPath())) // This line give null "Null Pointer exception" 
     { 
      return null; 
     } 
     return path; 
    } 

ich Überprüfung mich, ob die SD-Karte Pfad als Pfad gleiche ist, die durch Environment.getExternalStorageDirectory().getPath()

+1

'Environment.getExternalStorageDirectory()' tut keinen "Kontext" beinhalten, und daher sollten sich seine Ergebnisse nicht ändern, abhängig davon, wo der Anruf getätigt wurde. Bitte geben Sie eine [mcve] an, die zeigt, wie Sie 'Environment.getExternalStorageDirectory()' verwenden und wie Sie festgestellt haben, dass 'null' zurückgegeben wird. – CommonsWare

+0

@CommonsWare Ich habe einige zusätzliche Informationen hinzugefügt. Kannst du bitte einen Blick darauf werfen? – Rahulrr2602

+1

Ich denke, dass es wahrscheinlicher ist, dass 'path'' null' ist, so dass 'new File (path) .getPath()' 'null' ist. BTW, 'neue Datei (Pfad) .getPath()' ist sinnlos - es wäre schneller, dies nur mit 'Pfad' zu ersetzen. Beachten Sie auch, dass 'getExternalStorageDirectory()' auf den meisten Android-Geräten wenig mit "ext sd card" zu tun hat. – CommonsWare

Antwort

1

Idealerweise würde getExtSdCardPath() "idempotent" sein, die a phantastische Art zu sagen "macht das gleiche Arbeit und gibt das gleiche zurück, egal wie oft Sie es nennen".

In Ihrem Fall ist es nicht. Der erste Anruf an getExtSdCardPath() gibt den Wert zurück, den Sie wünschen, und der zweite Aufruf an getExtSdCardPath() gibt null zurück.

In Ihrem Fall ist es keine besondere Notwendigkeit getExtSdCardPath() zweimal anrufen, und Sie können durch Umschreiben Ihren Code so etwas wie um die idempotence Ausgabe so funktionieren:

path=getExtSdCardPath(con); 
if(path!=null) 
    { 
     if(new File(path).getPath().equal(Environment.getExternalStorageDirectory().getPath())) // This line give null "Null Pointer exception" 
     { 
      return null; 
     } 
     return path; 
    } 
+0

Nochmals vielen Dank für Ihre Hilfe. – Rahulrr2602

0

zurückgegeben Klingt wie Sie die gewünschte Erlaubnis im Manifest zu setzen vergessen ODER/UND habe vergessen, in Runtime nach einer solchen Erlaubnis zu fragen (falls du das auf Geräten mit Android 6.0 und höher ausführst).

versuchen Ihr Manifest AddTo: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Hier ist eine schnelle und einfache Implementierung Beispiel dafür, wie die Erlaubnis zur Laufzeit verlangen:

public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ 

    private static final int REQUEST_WRITE_PERMISSION = 111; //Number is not matter, just put what you want 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //Do your stuff with the file 
     } 
    } 

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

    private void requestPermission() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION); 
     } else { 
      //Do your stuff with the file 
     } 
    } 
} 
+0

Danke für die Antwort. Aber wie in der Frage gesagt, funktioniert es in einer Activity-Klasse gut und ich habe auch die Erlaubnis hinzugefügt und nehme auch Laufzeit-Erlaubnis für 6.0+. – Rahulrr2602