2017-09-26 156 views
0

我在我的应用程序中创建了一个从相机拍照的类。 该课程将使用相机拍摄照片并将其存储在具有唯一名称的文件夹中。 但是,当我想要得到图片路径onActivityResult方法Iget空data一直!通过拍摄来自相机的照片在onActivityResult中获得null null

这是我的照相机:

public class Camera{ 

    private Activity activity; 
    private SystemTools systemTools; 


    public Camera(Context context) { 

    this.activity = (Activity) context; 
    systemTools = new SystemTools(); 
    } 

    /** 
    * This Method will take a picture with camera for us 
    */ 

    public void takePicture() { 

    boolean cameraAvailable = systemTools.device_isHardwareFeatureAvailable(activity, PackageManager.FEATURE_CAMERA); 

    if (cameraAvailable && 
     systemTools.system_isIntentAvailable(activity, MediaStore.ACTION_IMAGE_CAPTURE)) { 

     Intent takePicIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     //We prepare the intent to store the taken picture 
     try { 

     File outputDir = systemTools.storage_getExternalPublicFolder("ReportsAttachments", true); 
     File outFile = systemTools.storage_createUniqueFileName("cameraPic", ".jpg", outputDir); 

     takePicIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile)); 

     } catch (Exception e) { 
     Toast.makeText(activity, "در دریافت تصویر اشکالی رخ داده است ، لطفا دوباره تلاش کنید.", Toast.LENGTH_SHORT).show(); 
     } 

     activity.startActivityForResult(takePicIntent, App.REQUEST_IMAGE_CAPTURE); 


    } else { 
     if (cameraAvailable) { 
     Toast.makeText(activity, "برنامه ی دوربین دستگاه خراب است.", Toast.LENGTH_SHORT).show(); 

     } else { 
     Toast.makeText(activity, "دسترسی به دوربین سیستم امکان پذیر نمی باشد.", Toast.LENGTH_SHORT).show(); 
     } 
    } 
    } 
} 

的I设在活动onActivityResult()方法,我用相机。像这样:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 
     if (requestCode == App.REQUEST_IMAGE_CAPTURE) { 
     if (resultCode == Activity.RESULT_OK && data != null) { 
      Log.i("ATTACH", "In Result"); 

      Bitmap bmp = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

      // CALL THIS METHOD TO GET THE URI FROM THE BITMAP 
      Uri selectedImage = getImageUri(this, bmp); 
      String realPath = getRealPathFromURI(selectedImage); 
      selectedImage = Uri.parse(realPath); 
      presenter.onNewAttachmentRequest(selectedImage.getPath()); 


     } 
     } 
    } catch (Exception e) { 
     Log.i("ATTACH", e + " Something went wrong"); 
    } 
    } 

能正常工作和抽放pictre是SD_Card avaliable,但是当我想要得到的图片的路径我cant't因为onActivityResult“数据”为空所有的时间! 这段代码的问题在哪里?

谢谢。

+0

请确保您有存储的权限,即读写权限,如果您的设备是marshmellow或以上,然后请添加运行时权限 –

+0

我得到了所有权限。但它不起作用。 – Ehsan

回答

0

takePicIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(outFile));

正如您所看到的,您已将文件Uri传递给intent,即Camera应用程序将在此路径中写入拍摄的图像,并且不会返回位图。 只需将该路径保存为全局的并在onActivityResult()中使用它即可。 您需要添加这也导致相机应用程序依赖于设备。

takePicIntent.putExtra(“return-data”,false);

+0

“ACTION_IMAGE_CAPTURE”没有额外记录的“返回数据”。 – CommonsWare

+0

是的,我知道。它没有它就会工作。我正面临一些与Moto E相机意图有关的问题,那么这就是我发现的 – ADM

0

当我想要得到的图片

的路径你已经有图片的路径。它是outFile。将它保存在一个字段中,并通过配置更改保存它。此外,由于Uri.fromFile()不会在Android 7.0+特别好工作,可考虑改用FileProvider,正如我在下面做活动从this sample project

/*** 
Copyright (c) 2008-2017 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

Covered in detail in the book _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.camcon; 

import android.Manifest; 
import android.app.Activity; 
import android.content.ActivityNotFoundException; 
import android.content.ClipData; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v4.content.FileProvider; 
import android.widget.Toast; 
import java.io.File; 
import java.util.List; 

public class MainActivity extends Activity { 
    private static final String EXTRA_FILENAME= 
    "com.commonsware.android.camcon.EXTRA_FILENAME"; 
    private static final String FILENAME="CameraContentDemo.jpeg"; 
    private static final int CONTENT_REQUEST=1337; 
    private static final String AUTHORITY= 
    BuildConfig.APPLICATION_ID+".provider"; 
    private static final String PHOTOS="photos"; 
    private File output=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState==null) { 
     output=new File(new File(getFilesDir(), PHOTOS), FILENAME); 

     if (output.exists()) { 
     output.delete(); 
     } 
     else { 
     output.getParentFile().mkdirs(); 
     } 

     Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output); 

     i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); 

     if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) { 
     i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     } 
     else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) { 
     ClipData clip= 
      ClipData.newUri(getContentResolver(), "A photo", outputUri); 

     i.setClipData(clip); 
     i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     } 
     else { 
     List<ResolveInfo> resInfoList= 
      getPackageManager() 
      .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

     for (ResolveInfo resolveInfo : resInfoList) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      grantUriPermission(packageName, outputUri, 
      Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     } 
     } 

     try { 
     startActivityForResult(i, CONTENT_REQUEST); 
     } 
     catch (ActivityNotFoundException e) { 
     Toast.makeText(this, R.string.msg_no_camera, Toast.LENGTH_LONG).show(); 
     finish(); 
     } 
    } 
    else { 
     output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); 
    } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putSerializable(EXTRA_FILENAME, output); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 
     Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output); 

     i.setDataAndType(outputUri, "image/jpeg"); 
     i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

     try { 
      startActivity(i); 
     } 
     catch (ActivityNotFoundException e) { 
      Toast.makeText(this, R.string.msg_no_viewer, Toast.LENGTH_LONG).show(); 
     } 

     finish(); 
     } 
    } 
    } 
} 
+0

谢谢,我知道我有图像路径,但是我已经在Camera类中拥有它了!我想在我使用Camera类的Activity中访问它。 – Ehsan

+0

@Ehsan:在摄像头类上放置一个吸气剂以返回路径。或者让活动决定路径并将其传递给'Camera'对象。 – CommonsWare

相关问题