Foto machen (MediaStore.ACTION_IMAGE_CAPTURE)

R

RealNiclas

Neues Mitglied
0
Guten Morgen/Mittag/Abend,
ich habe aktuell das Problem, dass, wenn ich folgenden Code ausführe, der Speicherort nicht erkannt wird (es also in der Galerie landet, statt an dem von mir vorgegebenen Pfad) und das aufgenommene Bild immer noch eine sehr niedrige Auflösung (142x252) hat.


Code:
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_add_item_activiy);

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    File file = new File(getExternalFilesDir("") + "/test.jpg");
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,file.getAbsolutePath());
                    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
                    startActivityForResult(intent,0);
                }
                catch (Exception e) { Log.d("mylog",e.getMessage()); }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Bitmap image = (Bitmap)data.getExtras().get("data");
        Log.d("mylog",image.getWidth() + "x" + image.getHeight());
    }

Hat jemand eine Ahnung woran das liegen könnte?
Gruß: Niclas.
 
Du darfst keine absoluten Pfade mehr in Intent Extras packen. Du brauchst eine content:// uri. Also entweder einen eigenen ContentProvider oder irgendwie anders an eine passende uir kommen.
Zum Größenproblem kann ich dir gerade nichts sagen, aber ich würde sagen es ist von der Kamera-App abhängig.
 
Ich habe das ganze jetzt mal wie folgt abgeändert:

Code:
@Override
            public void onClick(View view) {
                try {
                    File file = new File(getExternalFilesDir("") + "/test.jpg");
                    Uri uri = Uri.fromFile(file);

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
                    startActivityForResult(intent,0);
                }
                catch (Exception e) { Log.d("mylog",e.getMessage()); }
            }

Doch nun bekomme ich folgende Fehlermeldung:

file:///storage/emulated/0/Android/data/com.niclas.ped/files/test.jpg exposed beyond app through ClipData.Item.getUri()
 
jogimuc schrieb:
Hsllo zum Thema kleine Auflösung das was du dir aus dem intent holst ist nur die Vorschau nicht das Bild. Das Bild besser den link zu der Datei holst du dir auch aus dem intent.
How to Accessing the Camera and Take Pictures on Android

Android Camera API - Tutorial

Wenn ich der oberen Anleitung (How to Accessing the Camera and Take Pictures on Android) folge, bekomme ich immer noch diese Fehlermeldung:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.niclas.ped, PID: 5616
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/CameraDemo/IMG_20190903_190345.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
at android.net.Uri.checkFileUriExposed(Uri.java:2356)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:944)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10492)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10477)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1616)
at android.app.Activity.startActivityForResult(Activity.java:4564)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4522)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at com.realniiclas.ped.AddItemActiviy$1.onClick(AddItemActiviy.java:55)
at android.view.View.performClick(View.java:6897)
at android.widget.TextView.performClick(TextView.java:12693)
at android.view.View$PerformClick.run(View.java:26101)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 
RealNiclas schrieb:
Ich habe das ganze jetzt mal wie folgt abgeändert:

Code:
@Override
            public void onClick(View view) {
                try {
                    File file = new File(getExternalFilesDir("") + "/test.jpg");
                    Uri uri = Uri.fromFile(file);

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
                    startActivityForResult(intent,0);
                }
                catch (Exception e) { Log.d("mylog",e.getMessage()); }
            }

Doch nun bekomme ich folgende Fehlermeldung:

file:///storage/emulated/0/Android/data/com.niclas.ped/files/test.jpg exposed beyond app through ClipData.Item.getUri()

Ja, das ist ja immer noch eine file:// uri, du brauchst eine conent:// uri.
D.h du brauchst entweder einen eigenen ContentProvider (Creating a content provider  |  Android Developers) oder musst den User per Storage Access Framework einen Pfad auswählen lassen.
 
Ah Okay. Ich konnte mein Problem jetzt lösen.
Ich habe nun diesen Code in der AndroidManifest.xml hinzugefügt:

Code:
<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
        </provider>

Dies in meiner onClick Methode abgeändert:

Code:
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(AddItemActiviy.this,getApplicationContext().getOpPackageName() + ".fileprovider",file));

Und eine XML Datei mit den Pfaden hinzugefügt:

Code:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingDefaultResource">
    <external-path name="images" path="." />
</paths>

Jetzt funktioniert alles wie gewollt!
Danke für die Hilfe!
Gruß: Niclas.
 

Ähnliche Themen

T
Antworten
1
Aufrufe
814
swa00
swa00
A
Antworten
5
Aufrufe
974
jogimuc
J
H
Antworten
7
Aufrufe
1.642
haner
H
Zurück
Oben Unten