2015-09-01 1 views
2

Я звоню камеру через startActivityForResult с android.provider.MediaStore.ACTION_IMAGE_CAPTURE и android.provider.MediaStore.EXTRA_OUTPUT хотят получить полноразмерное захватили изображение обратно в моем onActivityResultACTION_IMAGE_CAPTURE с EXTRA_OUTPUT создает обрабатывается «Обработка ошибок Media Storage»

Но в тот момент я нажимаю на галочке после принимая изображение, момент, когда он должен быть доставлен обратно, я получаю сообщение об ошибке, которое свободно переводится как «Ошибка камеры - возникла проблема при сохранении одного из ваших изображений или клипов» - я могу закрыть диалоговое окно или отправить отзыв команда Google Dev.

выход Logcat в этот момент:

09-01 22:01:46.157 24523-24523/com.google.android.GoogleCamera E/CAM_FatalErrorHandler﹕ Handling Media Storage Failure: 
java.lang.Exception 
     at com.android.camera.FatalErrorHandlerImpl.onMediaStorageFailure(FatalErrorHandlerImpl.java:37) 
     at com.android.camera.PhotoModule.onError(PhotoModule.java:274) 
     at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1289) 
     at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593) 
     at android.view.View.performClick(View.java:4781) 
     at android.view.View$PerformClick.run(View.java:19873) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5289) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
09-01 22:01:46.158 24523-24523/com.google.android.GoogleCamera E/CAM_CameraUtil﹕ Show fatal error dialog 

Мой код (очищен от посторонних частей):

private File tmpFile; 
private Uri tmpFileURI; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 

    // TempFile needs to be created for the camera to store the fullsize captured image 
    // tmpFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + MainActivity.APP_BASE_FOLDER + "/tmp.jpg"); 
    try 
    { 
     tmpFile = File.createTempFile("my_app", ".jpg"); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    tmpFileURI = Uri.fromFile(tmpFile); 

    chooseCamera.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 

      takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      takePicture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tmpFileURI); 
      startActivityForResult(takePicture, CreateModifiyEventFragment.CHOOSE_BY_CAMERA);//zero can be replaced with any action code 

     } 
    }); 


    chooseLibrary.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 

      pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(pickPhoto, CreateModifiyEventFragment.CHOOSE_BY_LIBRARY);//one can be replaced with any action code 

     } 
    }); 

} 

Просмотренные константы объявляются так:

public final static int CHOOSE_BY_CAMERA = 1; 
public final static int CHOOSE_BY_LIBRARY = 0; 

код обратного вызова никогда не достигается, поэтому я просто пощажу вам больше кода. Вы можете видеть, что я попробовал его через tmpFile и обычный файл на внешнем хранилище.

Права доступа устанавливаются также

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Я понятия не имею, что вызывает эту ошибку или то, что я пропавших без вести. Я использовал другие ответы SO, чтобы создать этот код, и я не вижу никаких различий.

Любая помощь была бы принята с благодарностью. Спасибо заранее!

ответ

4

File.createTempFile() вряд ли даст вам что-то полезное на Android. Что еще более важно, у вас нет возможности узнать, может ли там приложение сторонней камеры. Выберите место на внешнем накопителе (например, getExternalFilesDir() или Environment.getExternalStoragePublicDirectory()):

package com.commonsware.android.camcon; 

import android.app.Activity; 
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 CameraContentDemoActivity extends Activity { 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

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

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

    output=new File(dir, "CameraContentDemo.jpeg"); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @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); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 

Кроме того, вам не нужно CAMERA разрешения, так как вы не фотографировать — вы задаете приложение стороннего сфотографировать.

+0

Я попробовал '// tmpFile = new File (Environment.getExternalStorageDirectory(). GetAbsolutePath() + MainActivity.APP_BASE_FOLDER +" /tmp.jpg ");' как вы можете видеть, с той же ошибкой. Но 'Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM)', кажется, разрешает ошибку. Можешь мне сказать почему? Не следует ли записывать камеру в первое место? – LilaQ

+1

@LilaQ: никогда не используйте конкатенацию строк для создания путей к файлам. Используйте соответствующие конструкторы 'File'. Я предполагаю, что то, что у вас есть, приводит к недопустимому пути (например, double '/', missing '/'). – CommonsWare

+0

Я вышел из пути, чтобы убедиться, что он действителен. Или камера рассматривается вне моего приложения, поэтому не имеет права на запись на externalStorageDirectory? – LilaQ

 Смежные вопросы

  • Нет связанных вопросов^_^