当不选择裁剪图像应用程序时,阻止应用程序崩溃-Android

用户名

我有一个可以从图库或相机中裁剪图像的应用程序。除了一个小功能,它工作得非常好。当我从图库中选择图像时,它会问我要使用哪种裁切应用程序来裁切图像,但是如果我在布局框外单击或按“后退”按钮,则整个应用程序将崩溃。如何使应用程序不崩溃?

这是我的主要活动

package com.goboapp;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.RequestParams;


public class Main extends ActionBarActivity {
    private Uri mImageCaptureUri;

    private static final int PICK_FROM_CAMERA = 1;
    private static final int CROP_FROM_CAMERA = 2;
    private static final int PICK_FROM_FILE = 3;

     ImageView imageView1;
     RoundImage roundedImage;
     Bitmap bitmap;
     ProgressDialog prgDialog;
     String encodedString;
     RequestParams params = new RequestParams();
     String imgPath, fileName;
     Bitmap bitmap2;
     TextView tv;
     String uploadFilePath;
     String uploadFileName;


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

        //SET VIEWS
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        tv = (TextView) findViewById(R.id.tv);


        //CAMERA STUFF

        final String [] items           = new String [] {"Take from camera", "Select from gallery"};                
        ArrayAdapter<String> adapter    = new ArrayAdapter<String> (this, android.R.layout.select_dialog_item,items);
        AlertDialog.Builder builder     = new AlertDialog.Builder(this);

        builder.setTitle("Select Image");
        builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
            public void onClick( DialogInterface dialog, int item ) { //pick from camera
                if (item == 0) {
                    Intent intent    = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
                                       "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

                    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

                    try {
                        intent.putExtra("return-data", true);

                        startActivityForResult(intent, PICK_FROM_CAMERA);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }
                } else { //pick from file
                    Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(i, PICK_FROM_FILE);

                }
            }
        } );

        final AlertDialog dialog = builder.create();

        Button button   = (Button) findViewById(R.id.btn_crop);

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

        //END END END CAMERA STUFF


         }// End OnCreate



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }//end onCreateOptionsMenu

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }//end onOptionsItemSelected



    //CAMERA STUFF

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) return;

        switch (requestCode) {
            case PICK_FROM_CAMERA:
                doCrop();

                break;

            case PICK_FROM_FILE: 
                mImageCaptureUri = data.getData();

                doCrop();

                break;          

            case CROP_FROM_CAMERA:          
                Bundle extras = data.getExtras();

                if (extras != null) {               
                    Bitmap photo = extras.getParcelable("data");

                   imageView1.setImageBitmap(photo);


                }

                File f = new File(mImageCaptureUri.getPath());            

                if (f.exists()) f.delete();

                break;

        }
    }



    //CROP IMAGE

      private void doCrop() {
        final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();

        Intent intent = new Intent("com.android.camera.action.CROP");
          intent.setType("image/*");

          List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );

          int size = list.size();

          if (size == 0) {          
            Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();

              return;
          } else {
            intent.setData(mImageCaptureUri);

              intent.putExtra("outputX", 200);
              intent.putExtra("outputY", 200);
              intent.putExtra("aspectX", 1);
              intent.putExtra("aspectY", 1);
              intent.putExtra("scale", true);
              intent.putExtra("return-data", true);

            if (size == 1) {
                Intent i        = new Intent(intent);
                ResolveInfo res = list.get(0);

                i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                startActivityForResult(i, CROP_FROM_CAMERA);
            } else {
                for (ResolveInfo res : list) {
                    final CropOption co = new CropOption();

                    co.title    = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                    co.icon     = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                    co.appIntent= new Intent(intent);

                    co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));

                    cropOptions.add(co);
                }

                CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);

                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Choose Crop App");
                builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
                    public void onClick( DialogInterface dialog, int item ) {
                        startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
                    }
                });

                builder.setOnCancelListener( new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel( DialogInterface dialog ) {

                        if (mImageCaptureUri != null ) {
                            getContentResolver().delete(mImageCaptureUri, null, null );
                            mImageCaptureUri = null;
                        }
                    }
                } );

                AlertDialog alert = builder.create();

                alert.show();
            }
          }
    }

      //END END END CROP IMAGE





}//end activity

这是CropOptionAdapter.java

package com.goboapp;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import android.content.Context;

import java.util.ArrayList;

public class CropOptionAdapter extends ArrayAdapter<CropOption> {
    private ArrayList<CropOption> mOptions;
    private LayoutInflater mInflater;

    public CropOptionAdapter(Context context, ArrayList<CropOption> options) {
        super(context, R.layout.crop_selector, options);

        mOptions    = options;

        mInflater   = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup group) {
        if (convertView == null)
            convertView = mInflater.inflate(R.layout.crop_selector, null);

        CropOption item = mOptions.get(position);

        if (item != null) {
            ((ImageView) convertView.findViewById(R.id.iv_icon)).setImageDrawable(item.icon);
            ((TextView) convertView.findViewById(R.id.tv_name)).setText(item.title);

            return convertView;
        }

        return null;
    }
}

这是CropOption.java

package com.goboapp;

import android.content.Intent;
import android.graphics.drawable.Drawable;

public class CropOption {
    public CharSequence title;
    public Drawable icon;
    public Intent appIntent;
}

这是crop_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>
</LinearLayout>

这是LogCat

11-17 20:17:15.708: E/AndroidRuntime(23829): FATAL EXCEPTION: main
11-17 20:17:15.708: E/AndroidRuntime(23829): Process: com.goboapp, PID: 23829
11-17 20:17:15.708: E/AndroidRuntime(23829): java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media/1448 from pid=23829, uid=10168 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.os.Parcel.readException(Parcel.java:1471)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.content.ContentProviderProxy.delete(ContentProviderNative.java:536)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.content.ContentResolver.delete(ContentResolver.java:1282)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at com.goboapp.Main$5.onCancel(Main.java:340)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1241)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.os.Handler.dispatchMessage(Handler.java:102)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.os.Looper.loop(Looper.java:136)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at android.app.ActivityThread.main(ActivityThread.java:5097)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at java.lang.reflect.Method.invokeNative(Native Method)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at java.lang.reflect.Method.invoke(Method.java:515)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-17 20:17:15.708: E/AndroidRuntime(23829):    at dalvik.system.NativeStart.main(Native Method)

我从主要活动中省略了一些不相关的功能。我也想知道是否有可能强迫用户使用默认的作物应用程序而不是要求他们选择。我遵循了获得此代码的教程,这就是为什么我不知道如何做到这一点的原因。

奥斯汀·马奥尼(Austyn Mahoney)

您的应用缺少权限android.permission.WRITE_EXTERNAL_STORAGE

我认为裁剪照片需要能够写入磁盘,因为它正在使用MediaProvider内容提供程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从图库裁剪图像崩溃的应用程序-Android

来自分类Dev

打开另一个应用程序时,Android应用程序关闭[不崩溃]

来自分类Dev

Android活动在切换应用程序时崩溃

来自分类Dev

xml布局在加载Android应用程序时崩溃

来自分类Dev

Xamarin Android,打开许多应用程序时崩溃

来自分类Dev

使用wakelock.release()关闭应用程序时,Android应用程序崩溃

来自分类Dev

使用wakelock.release()关闭应用程序时,Android应用程序崩溃

来自分类Dev

需要在Android应用程序中裁剪图像的示例

来自分类Dev

Android应用程序在简单应用程序中崩溃

来自分类Dev

Xamarin Forms (Android) StartForegroundService 不工作(应用程序崩溃)

来自分类Dev

应用程序从URL检索图像并在Android应用程序中显示崩溃

来自分类Dev

应用程序从URL检索图像并在Android应用程序中显示崩溃

来自分类Dev

Android从相机上传图像提供崩溃应用程序

来自分类Dev

当我点击运行应用程序时,android 服务消失了,当应用程序崩溃时也是如此

来自分类Dev

是否可以在不返回应用程序的情况下裁剪从Android上的Camera捕获的图像?

来自分类Dev

是否可以在不返回应用程序的情况下裁剪从Android上的Camera捕获的图像?

来自分类Dev

Proguard后Android应用程序崩溃

来自分类Dev

android Facebook SDK崩溃的应用程序?

来自分类Dev

Android应用程序在setText上崩溃

来自分类Dev

Android Map应用程序崩溃

来自分类Dev

暂停时Android应用程序崩溃

来自分类Dev

android应用程序在getString()行崩溃

来自分类Dev

Android WebView loadURL崩溃的应用程序?

来自分类Dev

Android应用程序不断与Tabhost崩溃

来自分类Dev

Android L:LinkageError使应用程序崩溃

来自分类Dev

Android按钮单击崩溃应用程序

来自分类Dev

Eclipse Android应用程序崩溃

来自分类Dev

Android setContentView使我的应用程序崩溃

来自分类Dev

Android JSoup使应用程序崩溃

Related 相关文章

  1. 1

    从图库裁剪图像崩溃的应用程序-Android

  2. 2

    打开另一个应用程序时,Android应用程序关闭[不崩溃]

  3. 3

    Android活动在切换应用程序时崩溃

  4. 4

    xml布局在加载Android应用程序时崩溃

  5. 5

    Xamarin Android,打开许多应用程序时崩溃

  6. 6

    使用wakelock.release()关闭应用程序时,Android应用程序崩溃

  7. 7

    使用wakelock.release()关闭应用程序时,Android应用程序崩溃

  8. 8

    需要在Android应用程序中裁剪图像的示例

  9. 9

    Android应用程序在简单应用程序中崩溃

  10. 10

    Xamarin Forms (Android) StartForegroundService 不工作(应用程序崩溃)

  11. 11

    应用程序从URL检索图像并在Android应用程序中显示崩溃

  12. 12

    应用程序从URL检索图像并在Android应用程序中显示崩溃

  13. 13

    Android从相机上传图像提供崩溃应用程序

  14. 14

    当我点击运行应用程序时,android 服务消失了,当应用程序崩溃时也是如此

  15. 15

    是否可以在不返回应用程序的情况下裁剪从Android上的Camera捕获的图像?

  16. 16

    是否可以在不返回应用程序的情况下裁剪从Android上的Camera捕获的图像?

  17. 17

    Proguard后Android应用程序崩溃

  18. 18

    android Facebook SDK崩溃的应用程序?

  19. 19

    Android应用程序在setText上崩溃

  20. 20

    Android Map应用程序崩溃

  21. 21

    暂停时Android应用程序崩溃

  22. 22

    android应用程序在getString()行崩溃

  23. 23

    Android WebView loadURL崩溃的应用程序?

  24. 24

    Android应用程序不断与Tabhost崩溃

  25. 25

    Android L:LinkageError使应用程序崩溃

  26. 26

    Android按钮单击崩溃应用程序

  27. 27

    Eclipse Android应用程序崩溃

  28. 28

    Android setContentView使我的应用程序崩溃

  29. 29

    Android JSoup使应用程序崩溃

热门标签

归档