Thursday 15 September 2011

imageview - Crop image from gallery crashes app - Android -



imageview - Crop image from gallery crashes app - Android -

i have code can crop image either gallery or taking 1 photographic camera , cropping it. code works when take photo photographic camera , crop if take crop 1 gallery crashes 1 time take crop app use. why crash when this? works great if utilize camera.

my code consists of 3 java files.

main

package com.goboapp; import java.io.file; import java.io.inputstream; import java.net.url; import java.util.arraylist; import java.util.list; import android.app.alertdialog; import android.content.activitynotfoundexception; import android.content.componentname; import android.content.dialoginterface; import android.content.intent; import android.content.pm.resolveinfo; 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.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.toast; 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; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); imageview1 = (imageview) findviewbyid(r.id.imageview1); //camera stuff final string [] items = new string [] {"take camera", "select 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 photographic 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); seek { intent.putextra("return-data", true); startactivityforresult(intent, pick_from_camera); } grab (activitynotfoundexception e) { e.printstacktrace(); } } else { //pick file intent intent = new intent(); intent.settype("image/*"); intent.setaction(intent.action_get_content); startactivityforresult(intent.createchooser(intent, "complete action using"), 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 photographic camera stuff }// end oncreate @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); homecoming true; } @override public boolean onoptionsitemselected(menuitem item) { // handle action bar item clicks here. action bar // automatically handle clicks on home/up button, long // specify parent activity in androidmanifest.xml. int id = item.getitemid(); if (id == r.id.action_settings) { homecoming true; } homecoming 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; } } 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 = new intent(intent); resolveinfo res = list.get(0); i.setcomponent( new componentname(res.activityinfo.packagename, res.activityinfo.name)); startactivityforresult(i, crop_from_camera); } else { (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 photographic camera stuff }//end activity

cropoption

package com.goboapp; import android.content.intent; import android.graphics.drawable.drawable; public class cropoption { public charsequence title; public drawable icon; public intent appintent; }

cropoptionadapter

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); homecoming convertview; } homecoming null; } }

the xml files utilize

activity_main

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context="com.goboapp.main" > <imageview android:id="@+id/imageview1" android:layout_width="90dp" android:layout_height="90dp" android:scaletype="centercrop" android:layout_gravity="center" /> <button android:id="@+id/btn_crop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="select image" android:layout_margintop="10dp" android:layout_below="@id/imageview1"/> </relativelayout>

crop_selector

<?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-14 00:33:14.164: e/androidruntime(1755): fatal exception: asynctask #1 11-14 00:33:14.164: e/androidruntime(1755): process: com.motorola.motgallery2, pid: 1755 11-14 00:33:14.164: e/androidruntime(1755): java.lang.runtimeexception: error occured while executing doinbackground() 11-14 00:33:14.164: e/androidruntime(1755): @ android.os.asynctask$3.done(asynctask.java:300) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.futuretask.finishcompletion(futuretask.java:355) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.futuretask.setexception(futuretask.java:222) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.futuretask.run(futuretask.java:242) 11-14 00:33:14.164: e/androidruntime(1755): @ android.os.asynctask$serialexecutor$1.run(asynctask.java:231) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1112) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:587) 11-14 00:33:14.164: e/androidruntime(1755): @ java.lang.thread.run(thread.java:841) 11-14 00:33:14.164: e/androidruntime(1755): caused by: java.lang.securityexception: permission denial: opening provider com.android.providers.media.mediadocumentsprovider processrecord{44b96898 1755:com.motorola.motgallery2/u0a40} (pid=1755, uid=10040) requires android.permission.manage_documents or android.permission.manage_documents 11-14 00:33:14.164: e/androidruntime(1755): @ android.os.parcel.readexception(parcel.java:1471) 11-14 00:33:14.164: e/androidruntime(1755): @ android.os.parcel.readexception(parcel.java:1425) 11-14 00:33:14.164: e/androidruntime(1755): @ android.app.activitymanagerproxy.getcontentprovider(activitymanagernative.java:2896) 11-14 00:33:14.164: e/androidruntime(1755): @ android.app.activitythread.acquireprovider(activitythread.java:4491) 11-14 00:33:14.164: e/androidruntime(1755): @ android.app.contextimpl$applicationcontentresolver.acquireunstableprovider(contextimpl.java:2323) 11-14 00:33:14.164: e/androidruntime(1755): @ android.content.contentresolver.acquireunstableprovider(contentresolver.java:1425) 11-14 00:33:14.164: e/androidruntime(1755): @ android.content.contentresolver.opentypedassetfiledescriptor(contentresolver.java:1047) 11-14 00:33:14.164: e/androidruntime(1755): @ android.content.contentresolver.openassetfiledescriptor(contentresolver.java:904) 11-14 00:33:14.164: e/androidruntime(1755): @ android.content.contentresolver.openinputstream(contentresolver.java:629) 11-14 00:33:14.164: e/androidruntime(1755): @ com.android.gallery3d.filtershow.cache.imageloader.loadbitmap(imageloader.java:331) 11-14 00:33:14.164: e/androidruntime(1755): @ com.android.gallery3d.filtershow.cache.imageloader.loadbitmapbounds(imageloader.java:306) 11-14 00:33:14.164: e/androidruntime(1755): @ com.android.gallery3d.filtershow.cache.imageloader.loadconstrainedbitmap(imageloader.java:359) 11-14 00:33:14.164: e/androidruntime(1755): @ com.android.gallery3d.filtershow.crop.cropactivity$loadbitmaptask.doinbackground(cropactivity.java:277) 11-14 00:33:14.164: e/androidruntime(1755): @ com.android.gallery3d.filtershow.crop.cropactivity$loadbitmaptask.doinbackground(cropactivity.java:261) 11-14 00:33:14.164: e/androidruntime(1755): @ android.os.asynctask$2.call(asynctask.java:288) 11-14 00:33:14.164: e/androidruntime(1755): @ java.util.concurrent.futuretask.run(futuretask.java:237) 11-14 00:33:14.164: e/androidruntime(1755): ... 4 more

thats entire app.

the app works when take take image camera, select crop app , save photo.

the app not work when take photo gallery. opens gallery , select image , take app want utilize crop image , app crashes.

there problem kitkat while using android.permission.manage_documents.you need work around.

try code:

public static final string kitkat_value = 1002; intent intent; if (build.version.sdk_int < 19){ intent = new intent(); intent.setaction(intent.action_get_content); intent.settype("*/*"); startactivityforresult(intent, kitkat_value); } else { intent = new intent(intent.action_open_document); intent.addcategory(intent.category_openable); intent.settype("*/*"); startactivityforresult(intent, kitkat_value); } @override public void onactivityresult(int requestcode, int resultcode, intent data) { if (requestcode == kitkat_value ) { if (resultcode == activity.result_ok) { // stuff } } }

if doesn't work, other work around reference : android gallery on kitkat returns different uri intent.action_get_content

hope help :)

android imageview crop

No comments:

Post a Comment