2016-05-04 8 views
3

Ich entwickle eine Kreuzworträtsel-Anwendung, die .puz Datei als Eingabe akzeptiert. Ich versuchte den folgenden Code, in dem die Anwendung keine .puz Datei vom Standarddateimanager annimmt, während sie das annimmt und das Spiel anfängt, wenn es durch Datei-manager des Drittanbieters wie ES Dateimanager geschickt wird. Gibt es eine Möglichkeit, die Eingabe über den Standard-Dateimanager zu akzeptieren?.puz Dateiauswahl- Android

public void loadFile(View view){ 
    Intent intent = new Intent(MediaStore.Files.FileColumns.DATA); 
    intent.setType("*/*"); 
    intent.putExtra("CONTENT_TYPE", "*/*"); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select PUZ file"), 1); 
} 

//selected file will be processed here 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == 1){ 
     if(resultCode == RESULT_OK){ 
      String path = getPath(data.getData()); 
      if(path!=null&&path.endsWith("puz")) { 
       try { 
        PuzzleDatabaseHelper dbHelper = WordsWithCrossesApplication.getDatabaseHelper(); 
        Intent intent = new Intent(Intent.ACTION_EDIT, null, this, PlayActivity.class); 
        intent.putExtra(PlayActivity.EXTRA_PUZZLE_ID, dbHelper.addPuzzle(new File(path),"dilip","",0)); 
        this.startActivity(intent); 
       } catch (Exception e) { 
       } 
      } 
      else 
       Toast.makeText(this, "Invalid Format or Try different File Manager to select file", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Antwort

1

Fügen Sie die folgenden intent-filter den jeweiligen activity Tag in Ihrem AndroidManifest:

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 

    <category android:name="android.intent.category.DEFAULT"/> 

    <data 
     android:host="*" 
     android:mimeType="*/*" 
     android:scheme="file"/> 

    <data android:pathPattern="/.*\\.puz"/> 
    <data android:pathPattern="/.*\\.PUZ"/> 
</intent-filter> 

Fügen Sie den folgenden Code in onCreate(Bundle) zu überprüfen, ob die Activity gestartet von einer anderen App:

if (getIntent().getData() != null) { 
    String path = getIntent().getData().getPath(); 
    if (path != null && path.toLowerCase(Locale.ENGLISH).endsWith(".puz")) { 
    File puz = new File(path); 
    // TODO: do stuff with puz 
    } 
} 

Hinweis: Dateimanager verwenden möglicherweise unterschiedliche Methoden zum Auffinden von Apps, die mit einer bestimmten Absicht/Datei umgehen können. Wenn Ihre App nicht in einem bestimmten Dateimanager angezeigt wird, versuchen Sie, Ihre intent-filter zu optimieren. Beispielsweise müssen Sie möglicherweise hinzufügen:

<data android:pathPattern="/.*\\..*\\.puz"/> 
<data android:pathPattern="/.*\\..*\\..*\\.puz"/> 
<data android:pathPattern="/.*\\..*\\..*\\..*\\.puz"/> 
<data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.puz"/> 
<data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.puz"/> 

Für Pfade, die mehr Punkte enthalten oder in versteckten Verzeichnissen sind. (siehe here)

Verwandte Themen