我的相机应用正在拍照,但是无法打开/保存。当我打开它时只是空白

我设计了一个应用程序,当我单击它时,相机将打开。我可以拍摄照片,但看不到它。它不保存。我是一个初学者,现在开始学习android。有人可以在这里帮助我吗?

添加了用于授予权限的标志,但是这也不起作用。

Mainactivity代码

package com.example.mycameraapp;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatactivity;
import androidx.core.content.FileProvider;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;

import java.io.File;

public class Mainactivity extends AppCompatactivity {

    private File output = null;
    private static final int CONTENT_REQUEST = 1745;
    private Uri photoURI;

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

        Intent i = new Intent(MediaStore.actION_IMAGE_CAPTURE);
        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

        output = new File(dir,"YOUR_APP_NAME" + File.separator + "YOUR_FILE_NAME");

        photoURI = FileProvider.geturiForFile(Mainactivity.this,BuildConfig.APPLICATION_ID + ".provider",output);

        i.addflags(Intent.flaG_GRANT_WRITE_URI_PERMISSION | Intent.flaG_GRANT_READ_URI_PERMISSION);
        i.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
        startactivityForResult(i,CONTENT_REQUEST);
    }

    @Override
    protected void onactivityResult(int requestCode,int resultCode,@Nullable Intent data) {
        super.onactivityResult(requestCode,resultCode,data);
        if (requestCode == CONTENT_REQUEST) {
            if (resultCode == RESULT_OK) {
                Intent i = new Intent(Intent.actION_VIEW);

                i.setDataAndType(photoURI,"image/jpeg");
                i.addflags(Intent.flaG_GRANT_WRITE_URI_PERMISSION | Intent.flaG_GRANT_READ_URI_PERMISSION);
                startactivity(i);
                finish();
            }
        }
    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mycameraapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsrtl="true"
        android:theme="@style/Apptheme">
        <activity android:name=".Mainactivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider
            android:authorities="com.example.mycameraapp.provider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:granturiPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

    </application>

</manifest>

错误日志

E/PICTURES: com.diune.media.data.L - fail to open: content://com.example.mycameraapp.provider/external_files/DCIM/YOUR_APP_NAME/YOUR_FILE_NAME
    java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
        at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
        at android.content.ContentProviderProxy.openTypedAssetfile(ContentProviderNative.java:698)
        at android.content.ContentResolver.openTypedAssetfileDescriptor(ContentResolver.java:1458)
        at android.content.ContentResolver.openAssetfileDescriptor(ContentResolver.java:1295)
        at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1148)
        at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1102)
        at com.diune.media.data.L.<init>(SourceFile:7)
        at com.diune.media.data.M.a(SourceFile:5)
        at com.diune.media.data.g.a(SourceFile:9)
        at com.diune.media.app.k.a(SourceFile:16)
        at com.diune.media.app.BigGalleryFragment.a(SourceFile:29)
        at com.diune.pictures.ui.b.run(SourceFile:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:215)
        at android.app.activityThread.main(activityThread.java:6939)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)
fanqi789 回答:我的相机应用正在拍照,但是无法打开/保存。当我打开它时只是空白

通过参考android文档更改了完整代码。

foo

provider_paths.xml

package com.example.mycameraapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static com.example.mycameraapp.BuildConfig.APPLICATION_ID;

public class MainActivity extends AppCompatActivity {

    private File output = null;
    private static final int REQUEST_TAKE_PHOTO = 1;
    private Uri photoURI;
    private String currentPhotoPath;

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

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(takePictureIntent.resolveActivity(getPackageManager()) != null) {

            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex){
                ex.printStackTrace();
            }
            if(photoFile != null) {
                photoURI = FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider",photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
                startActivityForResult(takePictureIntent,REQUEST_TAKE_PHOTO);
            }
        }

    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,/* prefix */
                ".jpg",/* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
                Intent i = new Intent(Intent.ACTION_VIEW);

                i.setDataAndType(photoURI,"image/jpeg");
                i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivity(i);
                finish();
        }
    }
}
本文链接:https://www.f2er.com/3132325.html

大家都在问