1

Это мой код получил от hereНевозможно сохранить обрезанное изображение - Android

public class CatFragment extends Fragment implements OnClickListener{ 

     private DBCreater dbCreate; 

     private static final int SELECT_PICTURE = 1; 

     private String selectedImagePath = "android.resource://com.example.abcd/" + R.drawable.pets; 
     private ImageView img; 
     //private Button imgBtn; 

     private Uri mCropImagedUri; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View gv = inflater.inflate(R.layout.new_pet, null); 

      Spinner sp = (Spinner) gv.findViewById(R.id.ETPetType); 
      // get reference 
      sp.setAdapter(new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_spinner_dropdown_item, petType)); 

      Button btnSubmit = (Button) gv.findViewById(R.id.ButtonNext); 
      btnSubmit.setOnClickListener(this); 

      img = (ImageView)gv.findViewById(R.id.ImageView01); 
     ((Button) gv.findViewById(R.id.ETPetImg)) 
         .setOnClickListener(new OnClickListener() { 
          public void onClick(View arg0) { 
           try { 
            Intent intent = new Intent(); 
            intent.setType("image/*"); 
            intent.setAction(Intent.ACTION_GET_CONTENT); 
            intent.putExtra("crop", "true"); 
            intent.putExtra("aspectX", 0); 
            intent.putExtra("aspectY", 0); 
            intent.putExtra("outputX", 200); 
            intent.putExtra("outputY", 200); 
            intent.putExtra("return-data", false); 

            File f = createNewFile("CROP_"); 
            try { 
             f.createNewFile(); 
            } catch (IOException ex) { 
             Log.e("io", ex.getMessage()); 
            } 

            mCropImagedUri = Uri.fromFile(f); 
            intent.putExtra(MediaStore.EXTRA_OUTPUT, 
              mCropImagedUri); 
            // start the activity - we handle returning in 
            // onActivityResult 
            startActivityForResult(intent, SELECT_PICTURE); 
                  } catch (ActivityNotFoundException anfe) { 
            // display an error message 

           } 
          } 
         }); 

       return gv; 

      } 


      private File createNewFile(String prefix){ 
       if(prefix==null || "".equalsIgnoreCase(prefix)){ 
        prefix="IMG_"; 
       } 
       File newDirectory = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.example.abcd/files/"); 
       if(!newDirectory.exists()){ 
        if(newDirectory.mkdir()){ 
         Log.d(this.getClass().getName(), newDirectory.getAbsolutePath()+" directory created"); 
        } 
       } 
       File file = new File(newDirectory,(prefix+System.currentTimeMillis()+".jpg")); 
       if(file.exists()){ 
        //this wont be executed 
        file.delete(); 
        try { 
         file.createNewFile(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

       return file; 
      } 


      public void onActivityResult(int requestCode, int resultCode, Intent data) { 
       if (resultCode == Activity.RESULT_OK) { 
        if (requestCode == SELECT_PICTURE) { 
         Uri selectedImageUri = data.getData(); 
         selectedImagePath = getPath(selectedImageUri); //To get image path 
         System.out.println("Image Path : " + selectedImagePath); 
         img.setImageURI(selectedImageUri); 


        } 
       } 
      } 

public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     //Cursor cursor = managedQuery(uri, projection, null, null, null); 
     Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     //access the database 
     dbCreate = new DBCreater(getActivity()); 

    } 



    @Override 
    public void onClick(View v) { 
     displayNextAlert(); 

    } 

Используя этот код я могу обрезать изображение, но это не спасает и возвращает статистику сообщение Тост Не удалось сохранить обрезанное изображение. Я не вижу других ошибок в LogCat. Пожалуйста, помогите кому-нибудь? Заранее спасибо.

LogCat:

11-15 07:15:38.215: E/AndroidRuntime(27214): FATAL EXCEPTION: main 
11-15 07:15:38.215: E/AndroidRuntime(27214): java.lang.RuntimeException: Unable to resume activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.NullPointerException 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2919) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2948) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2354) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.access$700(ActivityThread.java:159) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.os.Looper.loop(Looper.java:176) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.main(ActivityThread.java:5419) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at java.lang.reflect.Method.invokeNative(Native Method) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at java.lang.reflect.Method.invoke(Method.java:525) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at dalvik.system.NativeStart.main(Native Method) 
11-15 07:15:38.215: E/AndroidRuntime(27214): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.NullPointerException 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.deliverResults(ActivityThread.java:3500) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2906) 
11-15 07:15:38.215: E/AndroidRuntime(27214): ... 12 more 
11-15 07:15:38.215: E/AndroidRuntime(27214): Caused by: java.lang.NullPointerException 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1147) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.content.ContentResolver.query(ContentResolver.java:401) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.content.ContentResolver.query(ContentResolver.java:360) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at com.example.abcd.NewPetsFragment.getPath(NewPetsFragment.java:155) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at com.example.abcd.NewPetsFragment.onActivityResult(NewPetsFragment.java:143) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.Activity.dispatchActivityResult(Activity.java:5567) 
11-15 07:15:38.215: E/AndroidRuntime(27214): at android.app.ActivityThread.deliverResults(ActivityThread.java:3496) 
11-15 07:15:38.215: E/AndroidRuntime(27214): ... 13 more 
+0

Выезд решение на этот пост [ссылка] (http://stackoverflow.com/questions/11737659/how-to-crop-camera- images-for-portrait-view-in-android-version-3-0) – Wildroid

+0

Нет, это не работает, и я не думаю, что это решение. –

+0

Могут ли ваши устройства Android не монтироваться (например, старое устройство подключено к компьютеру), где он не может записываться во внешнее хранилище? У вас есть разрешения для WRITE_EXTERNAL_STORAGE? – Guardanis

ответ

1

Я получил код для работы путем изменения сохраненного путь к каталогу следующим образом:

File newDirectory = new File(Environment.getExternalStorageDirectory()+"/test/"); 

Причина: Я не мог спасти писать защищенный каталог «/ Android/data/com.example.abcd/files/"

и следующими изменениями к onActivityLes:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) { 
     // Uri selectedImageUri = data.getData(); 
     // selectedImagePath = getPath(selectedImageUri); //To get image path 

      selectedImagePath = mCropImagedUri.getPath(); //To get image path 

      System.out.println("Image Path : " + selectedImagePath); 
     // img.setImageURI(selectedImageUri); 


     } 
    } 
} 

ПРИМЕЧАНИЕ. Вам, вероятно, не нужно прокомментировать строку img.setImageURI. Я должен был проверить.

Убедитесь, что вы добавили разрешение на запись в AndroidManifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Thx. Надеюсь, этот будет работать. Я буду отмечать его как правильный ответ, как только проверю его. –

+0

@ Wildroid: он решил мой вопрос. Но я хочу спросить вас, что есть все-таки хранить в «/Android/data/com.example.abcd/files/»? Также мое приложение рушится после обрезки и сохранения изображения. Не могли бы вы решить эту проблему? Я думаю, что мне нужно получить новый путь для обрезанного изображения. Как мне это сделать? –

+0

@vinothkumar Вы тестируете устройство или эмулятор? Примечание. Если вы сохраните файл sdcard/Android/data/full.package.name, обрезанные изображения удаляются при удалении приложения. Насколько мне известно, вам нужен root-доступ для сохранения в каталоге данных Android. – Wildroid

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