簡體   English   中英

通過Intent捕獲照片

[英]Capture a photo by Intent

我正在嘗試從此處制作“拍照”教程,並按照所有步驟操作后仍然出現錯誤。 更確切地說,在我拍攝照片后,它顯示消息“相機已停止”。 我添加了一個按鈕,可在單擊時打開相機,並添加了imageView來顯示照片。 我正在嘗試在Samsung Galaxy S7(Android 8.0.0,API 26)上部署該應用程序。

這是setOnClickListener:

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

        Button button = (Button) findViewById((R.id.button));
        ImageView imageView = (ImageView)findViewById(R.id.imageView);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            button.setEnabled(false);
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchTakePictureIntent();

            }
        });
    }

這是相機的方法:

private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File imageView = null;
            try {
                imageView = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                ex.printStackTrace();
            }
            // Continue only if the File was successfully created
            if (imageView != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.example.camapp.fileprovider",
                        imageView);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }

文件路徑:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path
            name="my_images"
            path="Android/data/com.example.camapp/files/Pictures" />
</paths>

和許可:

<uses-feature android:name="android.hardware.camera"
        android:required="true" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

提供者:

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.camapp.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"></meta-data>
        </provider>

我在本教程中對onActivityResult()createImageFile()和galleryAddPic()具有相同的方法。

這是堆棧跟蹤:

java.lang.IllegalStateException: @NotNull method com/android/tools/idea/gradle/project/model/AndroidModuleModel.getRootDir must not return null
    at com.android.tools.idea.gradle.project.model.AndroidModuleModel.$$$reportNull$$$0(AndroidModuleModel.java)
    at com.android.tools.idea.gradle.project.model.AndroidModuleModel.getRootDir(AndroidModuleModel.java:571)
    at com.android.tools.idea.gradle.project.sync.setup.module.android.ContentRootsModuleSetupStep.findContentEntries(ContentRootsModuleSetupStep.java:71)
    at com.android.tools.idea.gradle.project.sync.setup.module.android.ContentRootsModuleSetupStep.doSetUpModule(ContentRootsModuleSetupStep.java:58)
    at com.android.tools.idea.gradle.project.sync.setup.module.android.ContentRootsModuleSetupStep.doSetUpModule(ContentRootsModuleSetupStep.java:41)
    at com.android.tools.idea.gradle.project.sync.setup.module.ModuleSetupStep.setUpModule(ModuleSetupStep.java:35)
    at com.android.tools.idea.gradle.project.sync.setup.module.common.BaseSetup.setUpModule(BaseSetup.java:41)
    at com.android.tools.idea.gradle.project.sync.ng.ModuleSetup.setupModuleModels(ModuleSetup.java:141)
    at com.android.tools.idea.gradle.project.sync.ng.CachedProjectModelsSetup.setUpModules(CachedProjectModelsSetup.java:116)
    at com.android.tools.idea.gradle.project.sync.ng.ProjectSetup$ProjectSetupImpl.setUpProject(ProjectSetup.java:82)
    at com.android.tools.idea.gradle.project.sync.ng.SyncResultHandler.onSyncSkipped(SyncResultHandler.java:164)
    at com.android.tools.idea.gradle.project.sync.ng.NewGradleSync.trySyncWithCachedGradleModels(NewGradleSync.java:219)
    at com.android.tools.idea.gradle.project.sync.ng.NewGradleSync.sync(NewGradleSync.java:165)
    at com.android.tools.idea.gradle.project.sync.ng.NewGradleSync.access$000(NewGradleSync.java:59)
    at com.android.tools.idea.gradle.project.sync.ng.NewGradleSync$2.run(NewGradleSync.java:151)
    at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:736)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:157)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:580)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:525)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:85)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
    at com.intellij.openapi.progress.impl.CoreProgressManager$4.run(CoreProgressManager.java:395)
    at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:314)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我想創建一個打開相機的按鈕來拍攝照片並將其保存在圖庫或其他指定的目錄中,因為我將對該照片進行一些圖像處理。我嘗試了所有關於yt的教程,但我確實很難找到這個問題的解決方案。感謝您提出的任何解決方案或建議。感謝您的寶貴時間!

如果您的應用要求相機單擊圖片,則應詢問CAMERA權限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

<uses-permission android:name="android.permission.CAMERA"/>
<!-- other permissions go here -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application ...>
    ...
</application>

然后,您的應用應提示用戶授予相機和存儲權限

if (ContextCompat.checkSelfPermission(YourActivityName.this,
    Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},
            YOUR_PERMISSIONS_REQUEST_CODE);

    // YOUR_PERMISSIONS_REQUEST_CODE is an
    // app-defined int constant. The callback method gets the
    // result of the request.

} else {
// Permission has already been granted
}

同時在清單文件中定義文件提供程序

 <provider
 android:name="android.support.v4.content.FileProvider"
 android:authorities="com.yourPackageName.fileprovider"
 android:exported="false"
 android:grantUriPermissions="true">
<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_list"></meta-data>
</provider> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM