【问题标题】:Get Image path from camera intent从相机意图获取图像路径
【发布时间】:2013-07-04 05:35:00
【问题描述】:

在我的应用程序中有从相机捕获图像的选项。但是从相机获取图像存在问题。当我使用ACTION_IMAGE_CAPTURE 时,它返回空数据。请帮助我 从相机意图获取图像路径

错误日志:

07-04 11:22:36.902: E/AndroidRuntime(8329): FATAL EXCEPTION: main
07-04 11:22:36.902: E/AndroidRuntime(8329): java.lang.RuntimeException: Unable to resume activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2836)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.access$1600(ActivityThread.java:117)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.os.Looper.loop(Looper.java:130)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at java.lang.reflect.Method.invokeNative(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at java.lang.reflect.Method.invoke(Method.java:507)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at dalvik.system.NativeStart.main(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2111)
07-04 11:22:36.902: E/AndroidRuntime(8329):     ... 13 more
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.pausefablogin.AddPOI.onActivityResult(AddPOI.java:281)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
07-04 11:22:36.902: E/AndroidRuntime(8329):     ... 14 more

提前致谢

【问题讨论】:

标签: android android-camera-intent


【解决方案1】:

试试这个

 Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(i , 0);          

然后调用它

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent resultData) {
    super.onActivityResult(requestCode, resultCode, resultData);

        if (resultData != null) {

        String[] projection = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        projection, null, null, null);
                int column_index_data = cursor
                        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToLast();

                String imagePath = cursor.getString(column_index_data);
                Bitmap bitmapImage = BitmapFactory.decodeFile(imagePath );
                imageView.setImageBitmap(bitmapImage );

            }

并使用你想要的prrmission

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,以下对我有用:

    @Override
    public void onClick(View v) {
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
                    }
            });
        }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
            final ContentResolver cr = getContentResolver();
            final String[] p1 = new String[] {
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATE_TAKEN
                    };
        Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC");
            if ( c1.moveToFirst() ) {
            String uristringpic = "content://media/external/images/media/" +c1.getInt(0);
             Uri uri = Uri.parse(uristringpic);
                try {
                  Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri);
    

    希望这会有所帮助,因为我知道这有多令人沮丧。

    【讨论】:

      【解决方案3】:

      如果您成功实现代码,您将获得捕获的图像,然后您可以手动保存它以供将来使用。

      @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
              if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {  
                  Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                  videoView.setVisibility(View.INVISIBLE);
                  imageView.setVisibility(View.VISIBLE);
                  imageView.setImageBitmap(photo);
              }
          } 
      

      【讨论】:

        【解决方案4】:

        您可以使用以下步骤:

        // create a global variable
        File destination;
        openCameraBtn.setOnClickListener(new OnClickListener() 
        {
        
                    @Override
                    public void onClick(View v) {
                         destination = new   File(Environment.getExternalStorageDirectory(),"image.jpg");
        
                         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                         intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination));
                         startActivityForResult(intent, CAMERA_PICTURE);
        
                    }
                });
        
        
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) 
            {
        
        
            if(requestCode == CAMERA_PICTURE && resultCode == Activity.RESULT_OK) 
                   {
                   try{
                    FileInputStream in = new FileInputStream(destination);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 10; //Downsample 10x
                    Log.d("PP", " bitmap factory=========="+options);
                    Bitmap user_picture_bmp = BitmapFactory.decodeStream(in, null, options);
                userImage.setImageBitmap(user_picture_bmp);
                } catch (Exception e) 
                  { e.printStackTrace();
                 }
        
            } 
        

        请在您的清单文件中声明权限和功能。

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

        如果你想更详细,那么你可以使用以下链接:

        http://developer.android.com/guide/topics/media/camera.html

        我希望你会成功。

        【讨论】:

        • 我必须在 CAMERA_PICTURE 中添加的内容。我可以添加任何数字或特定的东西
        • 您在清单文件中授予权限。
        • 这段代码在destination = new File(Environment.getExternalStorageDirectory(),"image.jpg");
        • destination = new File(getCacheDir(),"image.jpg");请你用这条线代替。
        • 您授予此权限: 并执行您的程序
        【解决方案5】:

        您可能正在运行三星设备。我相信这是这些设备中发生的错误。否则,您必须获取 URI。这样做:

        /**
          * (This is a variable instance) Contains the path and file name where you want to save the image.
          * Mainly used to start Intent.Action_View with this URI. (GalleryApp)
          */
        private Uri uriImage= null;
        
        public void onClickCamera(View v){
            // Cria uma intent para capturar uma imagem e retorna o controle para quem o chamou (NAO PRECISA DECLARAR PERMISSAO NO MANIFESTO PARA ACESSAR A CAMERA POIS O FAZEMOS VIA INTENT).
            // Creates an intent to capture an image and returns control to the caller
            Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
            // Cria um arquivo para salvar a imagem.
            // Creates an file to save the image.
            uriImage = ProcessaImagens.getOutputMediaFileUri( ProcessaImagens.MEDIA_TYPE_IMAGE, getActivity().getApplicationContext() );
            // Intent to pass a URI object containing the path and file name where you want to save the image. We'll get through the data parameter of the method onActivityResult().
            intent.putExtra( MediaStore.EXTRA_OUTPUT, uriImagem );
            // Starts the intent to image capture and waits the result.
            startActivityForResult( intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
        }
        

        ProcessaImagens 类是我编写并与大家分享的类。可以使用这个类来方便。如果要将图像保存在数据库中,它有一个很好的压缩图像的方法。在其onActivityResult() 方法中执行以下操作:

        @Override
        public void onActivityResult( int requestCode, int resultCode, Intent data ) {
            // If finished activity on startForActivityResult.
            if ( resultCode == Activity.RESULT_OK ) {
                if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
                    String imagePath = uriImage.getPath();
                    // I will compress the imagem. Read the javadoc from method and you'll see which it returns both bitmap and array bytes.
                    List<Object> imageCompact = ProcessaImagens.compactarImagem( uriImagem.getPath() );
                    Bitmap imageBitmap = (Bitmap) imageCompact.get( 0 );
                    byte[] imageBytes = (byte[]) imageCompact.get( 1 );
        
                }
            }
            // If canceled activity on startForActivityResult.
            else if ( resultCode == Activity.RESULT_CANCELED ) {
                if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
                    // User canceled the image capture.
                    Log.d( getTag(), "Image capture canceled!" );
                }
            }
            // If an error occurred in the activity on startForActivityResult.
            else {
                // Failed the image capture, alert the user.
                Toast.makeText( getActivity().getApplicationContext(), "FAILED! The image capture failed!", Toast.LENGTH_LONG ).show();
                Log.e( getTag(), "FAILED! The image capture failed!" );
            }
        }
        

        请注意,我使用了getActivity().getApplicationContext(),因为我从片段而不是从活动中获取上下文。我相信用这种方法你可以得到你想要的。只需对表单获取上下文的方式稍作更改即可。

        【讨论】:

        • 最好在此处翻译并添加答案,因为此处不接受仅链接的答案。
        • @Math 对不起我的英语。
        • 别抱歉。我只是在帮忙;)
        【解决方案6】:
         Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC");
                 if(cursor != null && cursor.moveToFirst())
                 {
                     do {
                         Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA)));
                         String photoPath = uri.toString();
                     }while(cursor.moveToNext());
        
        
                     cursor.close();
                 }
        

        当 while 循环进行最后一次迭代时,它会给出上次捕获的图像路径。

        【讨论】:

          【解决方案7】:

          确保您已将此标签放入清单文件中:&lt;uses-feature android:name="android.hardware.camera" /&gt;

          这可能会对您有所帮助:https://stackoverflow.com/a/10779050/2514032

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-13
            • 1970-01-01
            • 1970-01-01
            • 2011-11-30
            相关资源
            最近更新 更多