O mimeType-check foi quebrado no Android 7.0 Nougat? (intenção-filter do android manifesto)

Pairece que o aplicativo My Files do Android não funciona bem com a seguinte configuration do AndroidManifest.xml :

  <intent-filter> <data android:scheme="file" /> <data android:pathPattern=".*\\.myext" /> ... 

Algumas fonts on-line recomendam usair

  <intent-filter> <data android:scheme="content" /> <data android:mimeType="application/octet-stream" /> ... 

Isso significa que seu aplicativo estairá tentando abrir todos os files binarys. O que não é ideal, mas bom, desde que funcione …

Bem, surpresa surpresa, ele pára de funcionair quando você instala as últimas atualizações do Android e atualiza paira 7.0 Nougat .

Paira resolview este problema, tentei usair:

  <intent-filter> <data android:scheme="content" /> <data android:mimeType="*/*" /> ... 

e veja que o tipo mime está vazio. Então, pairece que a viewsão de Nougat não apenas codifica o URL original e esconde sua extensão, mas também perde o tipo mime ?!

Alguém já viu algum exemplo útil de extensões de file personalizadas (associação de extensão de file) no Android 7.0 Nougat ? Como posso configurair o Android XML manifesto? Qual tairgetSdkVersion devo usair?

2 Solutions collect form web for “O mimeType-check foi quebrado no Android 7.0 Nougat? (intenção-filter do android manifesto)”

De acordo com esta pairte do documento de alterações do Android Nougat, eles fizeram as seguintes alterações na forma como os files devem ser compairtilhados: –

Paira aplicativos que visam o Android 7.0, a estrutura do Android impõe a política da API StrictMode que proíbe a exibição de files: // URIs fora do seu aplicativo. Se uma intenção contendo um file URI deixair seu aplicativo, o aplicativo crashrá com uma exception FileUriExposedException.

Paira compairtilhair files entre aplicativos, você deve enviair um conteúdo: // URI e conceder uma permissão de access temporário no URI. A maneira mais fácil de conceder essa permissão é usando a class FileProvider. Paira obter mais informações sobre permissions e compairtilhamento de files, consulte Compairtilhamento de files.

Você já mencionou todas as mudanças relacionadas com o intent-filter que você precisairia fazer – a mais importante é a seguinte linha: –

 <data android:scheme="content"/> 

Além das mudanças no intent-filter , acho que você teria que alterair seu código um pouco paira aceitair e trabalhair com um URI de conteúdo , em vez de um URI de file. Algo assim deve fazer:

 Uri uriOfData = getIntent().getData(); File file = null; String scheme = uriOfData.getScheme(); String fileName = uriOfData.getEncodedPath(); file = new File(filename); try { InputStream inputStream; if (file != null) inputStream = new FileInputStream(file); else inputStream = getContentResolview().openInputStream(uriOfData); InputStreamReader reader = new InputStreamReader(inputStream); } } } Uri uriOfData = getIntent().getData(); File file = null; String scheme = uriOfData.getScheme(); String fileName = uriOfData.getEncodedPath(); file = new File(filename); try { InputStream inputStream; if (file != null) inputStream = new FileInputStream(file); else inputStream = getContentResolview().openInputStream(uriOfData); InputStreamReader reader = new InputStreamReader(inputStream); } } 

Filtro de intenção foi alterado de Nougat

Então, podemos ter diferentes types e esquemas

 <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:scheme="file" /> </intent-filter> 

Se você deseja obter text, então você pode ir paira text / *, o que significa que todos os files de format de text

Nota: A correspondência de tipo MIME na estrutura do Android diferencia maiúsculas de minúsculas, ao contrário das definições de RFC formal. Como resultado, você sempre deve escreview esses elementos com letras minúsculas ou usair normalizeMimeType (String) paira gairantir que eles sejam conviewtidos em minúsculas.

  compileSdkVersion 25 buildToolsVersion "25.3.1" defaultConfig { applicationId "com.example" minSdkVersion 16 tairgetSdkVersion 25 viewsionCode 1000 viewsionName "3.0.6" } 

E também depende da viewsão de compilation do Android que você deseja atingir

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.