آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

انتخاب عکس از گالری و یا دوربین، سپس برش قسمتی از آن + کد + آموزش

khanbeiki  7 سال پیش  6 سال پیش
+9 0

سلام

من به دنبال کدی بودم که بدون استفاده از کتابخانه برش عکس را انجام دهد.

بعد از چند روز جستجو بلاخره پیداش کردم ، خواستم در اختیار شما قرار بدم که ازش استفاده کنید.

این کد ها رو فقط کپی کنید. هیچ تغییری در آن ندهید. بخش هایی که ایراد داشت رو خودم درستش کردم.

اسم Activity ها و Xml ها را درست بزارید. براحتی کار میکنه.

اول از همه : در منیفست

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

در قسمت activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/btn_select_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:text="Select Image" />

<ImageView
android:id="@+id/img_photo"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginTop="10dp"
android:scaleType="fitXY" />
</LinearLayout>
</RelativeLayout>

در قسمت croping_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:gravity="center_vertical"
android:padding="10dp" >

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

<TextView
android:id="@+id/txt_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text=""
android:textColor="@android:color/black"
android:textSize="16sp" />

</LinearLayout>

تا اینجا فقط Xml ها بود.
حال نوبت به Activity ها میرسه

در قسمت MainAvtivity

 
package com.example.hello.myapplication;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
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.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {


private static final int CAMERA_CODE = 101, GALLERY_CODE = 201, CROPING_CODE = 301;

private Button btn_select_image;
private ImageView imageView;
private Uri mImageCaptureUri;
private File outPutFile = null;

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

outPutFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");

btn_select_image = (Button) findViewById(R.id.btn_select_image);
imageView = (ImageView) findViewById(R.id.img_photo);

btn_select_image.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
selectImageOption();
}
});
}

private void selectImageOption() {
final CharSequence[] items = { "Capture Photo", "Choose from Gallery", "Cancel" };

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Add Photo!");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {

if (items[item].equals("Capture Photo")) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg");
mImageCaptureUri = Uri.fromFile(f);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
startActivityForResult(intent, CAMERA_CODE);

} else if (items[item].equals("Choose from Gallery")) {

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, GALLERY_CODE);

} else if (items[item].equals("Cancel")) {
dialog.dismiss();
}
}
});
builder.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && null != data) {

mImageCaptureUri = data.getData();
System.out.println("Gallery Image URI : "+mImageCaptureUri);
CropingIMG();

} else if (requestCode == CAMERA_CODE && resultCode == Activity.RESULT_OK) {

System.out.println("Camera Image URI : "+mImageCaptureUri);
CropingIMG();
} else if (requestCode == CROPING_CODE) {

try {
if(outPutFile.exists()){
Bitmap photo = decodeFile(outPutFile);
imageView.setImageBitmap(photo);
}
else {
Toast.makeText(getApplicationContext(), "Error while save image", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

private void CropingIMG() {

//final ArrayList cropOptions = new ArrayList();
final ArrayList<CropingOption> cropOptions = new ArrayList();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");

// List list = getPackageManager().queryIntentActivities( intent, 0 );
ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>) getPackageManager().queryIntentActivities( intent, 0 );
int size = list.size();
if (size == 0) {
Toast.makeText(this, "Cann't find image croping app", Toast.LENGTH_SHORT).show();
return;
} else {
intent.setData(mImageCaptureUri);
intent.putExtra("outputX", 512);
intent.putExtra("outputY", 512);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);

//TODO: don't use return-data tag because it's not return large image data and crash not given any message
//intent.putExtra("return-data", true);

//Create output file here
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outPutFile));

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

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

startActivityForResult(i, CROPING_CODE);
}

else {

for (ResolveInfo res : list) {
final CropingOption co = new CropingOption();

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

}

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

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose Croping App");
builder.setCancelable(false);
builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
public void onClick( DialogInterface dialog, int item ) {
// startActivityForResult( (Intent) cropOptions.get(item), CROPING_CODE);
startActivityForResult( cropOptions.get(item).appIntent, CROPING_CODE);

}
});

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();
}
}
}

private Bitmap decodeFile(File f) {
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
final int REQUIRED_SIZE = 512;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}

// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}
return null;
}
}

قسمتهای کامنت شده لازم نیست . اگر دوست داشتین استفاده کنید.

در قسمت CropingOption

 package com.example.hello.myapplication;

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

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

در قسمت CropingOptionAdapter

 package com.example.hello.myapplication;

/**
* Created by Hello on 26/04/2016.
*/
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CropingOptionAdapter extends ArrayAdapter {
private ArrayList mOptions;
private LayoutInflater mInflater;

public CropingOptionAdapter(Context context, ArrayList options) {
super(context, R.layout.croping_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.croping_selector, null);

CropingOption item = (CropingOption) mOptions.get(position);

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

return convertView;
}

return null;
}

تمام شد.

نباید ارور بگیرد. اگر ارور داد یکجای کار شما میلنگد.

به امید موفقیت...

0 0
ممنون دوست عزیز من در برنامه جدیدم از این قابلیت باید استفاده کنم قبلن در موردش جسچوکرده بودم ولی به نتجهمطلوبی نرسیدم.ممنون که به اشتراک گذاشتید (7 سال پیش)
0 0
قسمتی از کد اشکال داشت - ویرایش کردم. (7 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
masoud  6 سال پیش
0 0

سلام. این کد مشکل داره عکس رو داخل ایمیج ویو نمایش نمیده

پاسخ به سوال 
masoud  6 سال پیش
0 0

package com.example.masoud.testtwoponez;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;

public class MainActivity extends Activity {
private static final int CAMERA_CODE = 101, GALLERY_CODE = 201, CROPING_CODE = 301;

private Button btn_select_image;
private ImageView imageView;
private Uri mImageCaptureUri;
private File outPutFile = null;
boolean s;
final int KeyGallery = 100, ReadExternalRequestCode = 200;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
s = checkPermission(MainActivity.this);

outPutFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");

btn_select_image = findViewById(R.id.btn_select_image);
imageView = findViewById(R.id.img_photo);

btn_select_image.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
boolean s = checkPermission(MainActivity.this);
Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
if (s)
selectImageOption();
}
});
}

@Override
protected void onResume() {
super.onResume();
btn_select_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean s = checkPermission(MainActivity.this);
if (s)
selectImageOption();
}
});

}

private void selectImageOption() {
final CharSequence[] items = {"Capture Photo", "Choose from Gallery", "Cancel"};

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Add Photo!");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {

if (items[item].equals("Capture Photo")) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg");
mImageCaptureUri = Uri.fromFile(f);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
startActivityForResult(intent, CAMERA_CODE);

} else if (items[item].equals("Choose from Gallery")) {

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, GALLERY_CODE);

} else if (items[item].equals("Cancel")) {
dialog.dismiss();
}
}
});
builder.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);


if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && null != data) {

mImageCaptureUri = data.getData();
System.out.println("Gallery Image URI : " + mImageCaptureUri);
CropingIMG();

} else if (requestCode == CAMERA_CODE && resultCode == Activity.RESULT_OK) {

System.out.println("Camera Image URI : " + mImageCaptureUri);
CropingIMG();
} else if (requestCode == CROPING_CODE) {

try {
if (outPutFile.exists()) {
Bitmap photo = decodeFile(outPutFile);
Toast.makeText(this, "" + outPutFile, Toast.LENGTH_SHORT).show();
imageView.setImageBitmap(photo);

} else {
Toast.makeText(getApplicationContext(), "Error while save image", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

private void CropingIMG() {

//final ArrayList cropOptions = new ArrayList();
final ArrayList<CropingOption> cropOptions = new ArrayList();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");

// List list = getPackageManager().queryIntentActivities( intent, 0 );
ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>) getPackageManager().queryIntentActivities(intent, 0);
int size = list.size();
if (size == 0) {
Toast.makeText(this, "Cann't find image croping app", Toast.LENGTH_SHORT).show();
return;
} else {
intent.setData(mImageCaptureUri);
intent.putExtra("outputX", 512);
intent.putExtra("outputY", 512);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);

//TODO: don't use return-data tag because it's not return large image data and crash not given any message
//intent.putExtra("return-data", true);

//Create output file here
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outPutFile));

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

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

startActivityForResult(i, CROPING_CODE);
} else {

for (ResolveInfo res : list) {
final CropingOption co = new CropingOption();

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

}

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

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose Croping App");
builder.setCancelable(false);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// startActivityForResult( (Intent) cropOptions.get(item), CROPING_CODE);
startActivityForResult(cropOptions.get(item).appIntent, CROPING_CODE);

}
});

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();
}
}
}

private Bitmap decodeFile(File f) {
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
final int REQUIRED_SIZE = 512;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}

// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}
return null;
}

public boolean checkPermission(final Context context) {
int currentAPIVersion = Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { // ابتدا کنترل می کند تا اندروید بالاتر M باشد
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // اگر دسترسی خواندن مموری را نداشته باشد دستورات داخل شرط اجرا می شود.
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);//یک دیالوگ ایجاد می شود.
alertBuilder.setCancelable(true);// بصورت قابل کنسل شدنی
alertBuilder.setTitle("Permission necessary");// با عنوان نیازمند دسترسی
alertBuilder.setMessage("External storage permission is necessary"); // متن دسترسی
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { // دکمه مثبت
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, ReadExternalRequestCode); // نتیجه با کلید ReadExternalRequestCode فرستاده می شود.
}
});
AlertDialog alert = alertBuilder.create(); // دیالوگ را ایجاد میکند.
alert.show(); // دیالوگ را نمایش می دهد.
} else {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, ReadExternalRequestCode); // نتیجه با کلید ReadExternalRequestCode فرستاده می شود.
}
return false;// دسترسی تایید نشده باشد جواب منفی داده می شود.
} else {
return true;// دسترسی تایید شده جواب مثبت می شود.
}
} else {
return true;// دسترسی تایید شده جواب مثبت می شود.
}

}
}
پاسخ به سوال 
masoud  6 سال پیش
0 0

این کد برای اندروید mبه بالا درست کار میکنه در کدهایی که دوست عزیز گذاشته بودن پرمیژن برای اندروید مارشملو به بالا گذاشته نشده بود


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .