In je codefragmentje vraag je kolom 0 op, dat is niet de kolom waar de filename in staat. De juiste kolom vraag je in Java op via cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME ).
Ik heb hieronder even een volledig (getest, werkend) voorbeeldje in Android Java uitgeschreven. Ik werk al een jaar of 8 niet meer met Delphi, dus ik kan je echt niet helpen met het stukje vertalen naar FMX. Eventueel kunnen andere mensen op het forum vast wel bijspringen als de vertaalslag stukloopt.
Ik weet niet waarom het in jouw testen niet werkt onder Android 10, ik heb dat nu niet expliciet getest. Het is ongetwijfeld een kwestie van instellingen/permissies, ik zou je aanraden eerst de "werkende" situatie af te polijsten. Dit is echt de standaard manier om file associations te implementeren onder Android, een andere manier is er niet bij mijn weten.
Code:
package com.eponalabs.test.gpxviewer;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Objects;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String action = intent.getAction();
if (Objects.equals(action, Intent.ACTION_VIEW))
{
String scheme = intent.getScheme();
ContentResolver resolver = getContentResolver();
if (Objects.equals(scheme, ContentResolver.SCHEME_CONTENT))
{
Uri uri = intent.getData();
if (uri == null)
return;
// Filename uitlezen
String name = getFilename(uri);
// Data uitlezen
InputStream inputStream;
try
{
// Inputstream even omzetten naar bytes
inputStream = resolver.openInputStream(uri);
if (inputStream == null)
return;
byte[] data = convertToByteArray(inputStream);
// Hier gaan we iets interessanters doen met deze bytes dan deze toast
String text = String.format(Locale.US, "We hebben %d bytes uit het bestand %s gelezen", data.length, name);
Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG);
toast.show();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
public String getFilename(Uri uri)
{
String result = null;
if (uri != null && Objects.equals(uri.getScheme(), "content"))
{
try (Cursor cursor = getContentResolver().query(uri, null, null, null, null))
{
if (cursor != null && cursor.moveToFirst())
{
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
}
}
if (result == null && uri != null)
{
result = uri.getPath();
if (result != null)
{
int cut = result.lastIndexOf('/');
if (cut != -1)
{
result = result.substring(cut + 1);
}
}
}
return result;
}
public byte[] convertToByteArray(InputStream inputStream) throws IOException
{
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1)
{
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
}
Bookmarks