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

حذف شدن permision های برنامه در اندروید 6 + آموزش برطرف کردن این مشکل

Hajhosseini  7 سال پیش  6 سال پیش
+58 0

با سلام و خسته نباشید خدمت دوستان
همونطوری که در جریانید، فقط permission تعریف کردن توی منیفست در اندروید 6 کافی نیست و در هنگام اجرا برنامه به دلیل نداشتن permision ها کرش میکنه. برای حل این مشکل باید هرزمانی که میخواستیم از یک permission استفاده کنیم اول چک کنیم که آیا کاربر دسترسی داره یا خیر. برای این موضوع چند تا از بچه ها از من سوال پرسیدن که باید همه جا همه کدهارو از اول بشینیم بنویسیم یا میشه یه بار نوشت و استفاده کرد. راه حلی که من پیشنهاد میدم به صورت زیره:

1- یک اکتیویتی parent تعریف کنید، BaseActivity و کدهای زیر رو توش قرار بدید:

package activity;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;

/**
 * Created by Hajhosseini on 6/7/2016.
 */
public class BaseActivity extends AppCompatActivity {

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Intent intent = new Intent("PERMISSION_RECEIVER");
intent.putExtra("requestCode",requestCode); intent.putExtra("permissions",permissions); intent.putExtra("grantResults",grantResults); sendBroadcast(intent); } }

 

2- در مرحله دوم باید تمامی اکتیویتی هایی که درش کدهایی که از permission ها استفاده میشه رو از این اکتیویتی اکستندز کنید.

3- کلاس زیر رو توی برنامه بسازید و تمام کدها رو توش قرار بدید

 package handler;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

/**
 * Created by Hajhosseini on 6/6/2016.
 */
public class PermissionHandler {

    /**
     * Permission Sample : android.Manifest.permission.WRITE_EXTERNAL_STORAGE
     * String array of Permissions
     */
    private BroadcastReceiver permissionReceiver;
    private OnPermissionResponse listener;
    private Activity activity;

    public void checkPermission(Activity _activity,String[] permission,OnPermissionResponse _listener) {
        listener = _listener;
        activity = _activity;

        if (Build.VERSION.SDK_INT >= 23) {
            for(int i = 0;i<permission.length;i++) {
                if (activity.checkSelfPermission(permission[i]) == PackageManager.PERMISSION_GRANTED) {
                    if(i == permission.length-1) {
                        listener.onPermissionGranted();
                        Log.v("TAG", "Permission is granted");
                    }
                } else {
                    i = permission.length;
                    registerReceiver();
                    ActivityCompat.requestPermissions(activity, permission, 1);
                    Log.v("TAG", "Request permission");
                }
            }

        } else {
            //permission is automatically granted on sdk<23 upon installation
            Log.v("TAG", "Permission is granted");
            listener.onPermissionGranted();
        }
    }

    /**
     *  One Permission
     */
    public void checkPermission(Activity _activity,String permission,OnPermissionResponse _listener) {
        listener = _listener;
        activity = _activity;

        if (Build.VERSION.SDK_INT >= 23) {
            if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
                listener.onPermissionGranted();
            } else {
                registerReceiver();
                ActivityCompat.requestPermissions(activity, new String[]{permission}, 1);
            }

        } else {
            //permission is automatically granted on sdk<23 upon installation
            Log.v("TAG", "Permission is granted");
            listener.onPermissionGranted();
        }
    }

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
            // You can send your permission list or granted, but we already know what permission we need
            listener.onPermissionGranted();
        }else {
            listener.onPermissionDenied();
        }
    }

    public interface OnPermissionResponse{
        void onPermissionGranted();
        void onPermissionDenied();
    }

    private void registerReceiver() {
        permissionReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Bundle extras = intent.getExtras();
                if (extras != null)
                {
                    int requestCode = extras.getInt("requestCode");
                    String[] permissions = intent.getStringArrayExtra("permissions");
                    int[] grantResults = intent.getIntArrayExtra("grantResults");
                    onRequestPermissionsResult(requestCode,permissions,grantResults);
                    activity.unregisterReceiver(permissionReceiver);
                }
            }
        };

        IntentFilter localIntentFilter = new IntentFilter();
        localIntentFilter.addAction("PERMISSION_RECEIVER");
        activity.registerReceiver(permissionReceiver, localIntentFilter);
    }

}

 

4- در مرحله آخر برای استفاده، هرجا که نیاز به گرفتن permission بود از کد زیر استفاده کنید:
توجه داشته باشید که هم میتونید 1 permission درخواست کنید، هم یک آرایه از permission ها.

  new PermissionHandler().checkPermission(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionHandler.OnPermissionResponse() {
            @Override
            public void onPermissionGranted() {
				// permission granted
                // your code
            }

            @Override
            public void onPermissionDenied() {
                // User canceled permission
            }
        });

موفق باشید ;)

+2 0
احسنت :) (7 سال پیش)
0 0
برای چک کردن تعدادی permision باید چیکار کرد (7 سال پیش)
0 0
کانستراکتور بالایی برای همین کاره، یک آرایه از پرمیشن هارو میگیره. البته میشه با یک حلقه، چند تا پرمیشن گرفت ولی معقول تر اینه که از همین روش استفاده بشه. (7 سال پیش)
+1 0
سلام یه سوالی داشتم چطور نرم افزار هایی مثل بازار بعد از نصب شدن تو اندروید 6 به بعد هیچ permission از کاربر نمیخان اما کرش هم نمیکنن؟ (7 سال پیش)
+1 0
بازار خودش اتوماتیک خودش رو اپدیت میکنه، توی این چند ماهه هم آپدیت داشتن. تفاوت اینجاست که گوگل خیلی وقته که اعلام کرده که این اتفاق ها می افته، برنامه نویسای بازار یک اخلاق خوبی که دارن اینه که همیشه به روزن. یک دلیل دیگش هم میتونه این باشه که به گارد کردن کد اهمیت میدن. گارد کردن کد، قبل از ریلیز انجام میشه و به معنی جلوگیری از کرش در کل پروژست، در سرور به معنای هندل کردن تمام اررور ها و مانع شدن از کرش کردن سروره. برای این کار به ساده ترین روش، فقط کافیه تمام کدهاتون رو توی try catch قرار بدید. البته توجه داشته باشید فقط و فقط لحظه آخر قبل از release اینکارو بکنید و حتما خطا رو توی catch چاپ کنید که بعدا دچار مشکل نشید. روش های دیگه ای هم هست که این کار رو تکمیل میکنه، مثلا تست برنامه با junit و ابزار های مشابه و ... (7 سال پیش)
0 0
توی اون متد onPermissionDenied که نوشته User canceled permssion باید چه کدی رو بنویسیم ؟ (7 سال پیش)
+1 0
میتونی یه toast بذاری ک جهت نصب کامل کاربر حتما پرمیشن ها رو قبول کنه (7 سال پیش)
0 0
یه سوال دیگه وقتی که میشه با تغییر target این مشکل رو برطرف کرد یا بهتر بگم استفاده از target 23 چه مزیتی داره که target 22 نداره ؟ اضلا این target چی رو مشخص میکنه به چه دردی میخوره میشه توضیح بدی؟ مرسی! (7 سال پیش)
0 0
مهران جان تغییرات زیاده و هیچ کس همشو نمیدونه. برای فهمیدنش بهتره تغییرات رو توی سایت گوگل ببینید. ولی در target 22 هم بعضی از پرمیشن هارو که روی اندروید 6 میخوای باز کنی کرش میکنه. برای همین بهتره پروژه رو گارد کنید یا از این روش استفاده کنید. (7 سال پیش)
0 0
منظور از گارد کردن چیه؟؟ و اینکه اگه کلا target رو بر داریم چه اتفاقی می افته؟ (7 سال پیش)
0 0
منظور از گارد کردن، قرار دادن کدها توی try catch (همه قسمت هایی که امکان کرش دارن) هست. تارگت رو که نمیشه برداشت!!! (7 سال پیش)
0 0
(7 سال پیش)
0 0
(7 سال پیش)
0 0
2- در مرحله دوم باید تمامی اکتیویتی هایی که درش کدهایی که از permission ها استفاده میشه رو از این اکتیویتی اکستندز کنید. میشه اینو بیشتر توضیح بدید و یه نمونه بگید. (7 سال پیش)
+2 0
توی آموزش های استاد اقاجانی اگر اشتباه نکنم یک جاهایی از activity Enhance استفاده میکرد. به همون صورته. شما یک کلاس به نام BaseActvity یا هر نامی که میخواید میسازید. درست مانند بالا که من ساختم. سپس اکتیویتی که میخواید توش پرمیشن رو بگیرید از اون اکستندز میکنید. (7 سال پیش)
0 0
با سلام. داخل متد onPermissionGranted() چطوری باید پرمیشن ها رو تعریف کنیم؟ و بعد از تعریف کار تمومه؟ (7 سال پیش)
0 0
زمانی کاربر وارد onPermissionGranted میشه که پرمیشن داده باشه! شما توی پارامترهای ورودی کلاس، لیست پرمیشن هاتون رو ارسال میکنید نه توی این متد. (7 سال پیش)
+1 0
برای گرفتن پرمیشن داخل کلاس G که از اپلیکیشن اکستندز میشه باید چیکار کرد؟ (7 سال پیش)
+2 0
از کانستراکتوری که کانتکست میگیره استفاده کنید (7 سال پیش)
+1 0
سلام یه سوال داشتم. فرض کنید من 10 تا اکتیویتی دارم و توی هر کدوم از اونا میام یه پوشه می سازم که مطمئنا نیاز به پرمیشن WRITE_EXTERNAL_STORAGE داره. و فرض کنید که اولین اکتیویتی که توی برنامه من اجرا میشه ActivityFirst هست. حالا باید بیام توی هر 10 اکتیویتی جایی رو که پوشه ساخته میشه کد new PermissionHandler().checkPermission رو بنویسم و توی متد onPermissionGranted()بگم که پوشه رو بساز یا اینکه توی ActivityFirst با کد new PermissionHandler().checkPermission هر پرمیشنی که نیاز داشتمو بگیرم و اگه کاربر پذیرفت دیگه موقع ساخت پوشه توی اکتیویتی های دیگه خود اندروید تشخیص میده که پرمیشن ها پذیرفته شدن؟ یه سوال دیگه: اینکه برنامه میاد از کاربر دسترسی به پرمیشن ها رو اجازه می گیره فقط یکبار اتفاق میفته یا اینکه هر بار که برنامه باز بشه این کارو میکنه؟ ممنون میشم راهنمایی کنید... (7 سال پیش)
+1 0
سلام. روش درست اینه که هربار چک کنید. چون یکسری ادم ... وجود داره که برای بدنام کردن اسم اپتون میان وسط استفاده از اپ پرمیشن رو برمیدارن. بعد از کرش اپلیکیشن عکس میگیرن و سو استفاده میکنن! درستش اینه که هرجا خواستید از پرمیشنی استفاده کنید، در onPermissionGranter استفاده کنید که هیچ وقت مشکلی پیش نیاد. (7 سال پیش)
0 0
اگه یه آرایه از پرمیشن ها رو چک کنم متد onPermissionGranted() فقط یکبار اجرا میشه یا به تعداد پرمیشن ها؟ (7 سال پیش)
+2 0
تا اونجایی که یادمه به تعداد آرایه چک میشد. حتی کاربر باید ۲ بار تایید کنه توی بعضی شرایط. ولی باز تست کنید مطمئن نیستم (7 سال پیش)
0 0
در مرحله ی 2 که قراره اونکارو بکنیم، مثلا من کلاس G که از Application اکتندز شده رو نمیتونم دوباره از BaseActivity اکستندز کنم.چیکار کنم؟ (7 سال پیش)
0 0
کلاس G که کلا جداست شما باید یه اکتیویتی دیگه بسازی و اسم رو بزاری BaseActivity که از AppCompatActivity اکستندز شده بعد سایر اکتیویتی هارو به جایی اینکه از AppCompatActivity اکستندز کنی از BaseActivity اکستندز می کنی (7 سال پیش)
0 0
من توی کلاس G یک فایل کپی میکنم توی کارت حافظه ولی نمیشه از BaseActivity اکستندز کنم ، باید چی کار کنم ؟ ممنون (7 سال پیش)
+1 0
دوست عزیز اکتیویتی هارو باید از BaseActivity اکستندز کنی. کلاس G که اکتیویتی نیست، کلاسی از نوع Application هست. بهتره توی اولین اکتیویتی که اجرا میشه پرمیشن هارو چک کنید نه توی کلاس G یا App (7 سال پیش)
0 0
ممنون آقای مهندس حاج حسینی عزیز ... بسیار عالی بود ... بنده طبق توضحیات جنابعالی پیش رفتم و برای دوستانی هم که از آموزش استاد برای دیتابیس استفاده میکنند .. بنده enhancedactivity ایجاد کردم طبق اموزش استاد و کدهایی که مربوط به ارتباط به پایگاه داده و ساخت دیتابیس هست رو از کلاس G به این کلاس انتقال دادم و enhancecactiviy رو از کلاس BaseActiviy اکستندز کردم .. که جواب داد ممنونم (6 سال پیش)
 برای این سوال 13 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
Hajhosseini  7 سال پیش
+12 0

 پاسخ صحیح

دوستانی که از سرویس استفاده میکنن و قصد گرفتن permission در سرویس رو دارن میتونن از کد زیر استفاده کنن:

 public void checkPermission(Context _context,String permission,OnPermissionResponse _listener) {
        listener = _listener;
        context = _context;

        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(context,permission) == PackageManager.PERMISSION_GRANTED) {
                listener.onPermissionGranted();
            } else {
                registerReceiver();
                ActivityCompat.requestPermissions(activity, new String[]{permission}, 1);
            }

        } else {
            //permission is automatically granted on sdk<23 upon installation
            Log.v("TAG", "Permission is granted");
            listener.onPermissionGranted();
        }
    }

توی سرویس میشه فقط چک کرد آیا اپلیکیشن permission داره یا خیر، هیچ راهی نداره که بشه permission گرفت. برای دور زدن این مشکل باید یک اکتیویتی باز کنید و توی اون از کاربر اجازه دریافت permission رو بگیرید! سرویس AutoDownload روی پوش هرکس نوشته، دیگه کار نمیکنه...

+1 0
با سلام و خسته نباشین. خدمت استاد عزیز و گرامی. با تشکر از زحمتتتون. خیلی خوب بود .خدایشش دمت گرم. چنان کلافم کرده بود که دیگه نا امید شده بودم. مرسی. خیر بیبنی. (7 سال پیش)
+1 0
آیا توی کلاس G و یا هر کلاسی ک از application Extends شده میشه از این روش استفاده کرد (7 سال پیش)
+1 0
فقط از روشی که کانتکست میگیره میشه استفاده کرد. یعنی میشه چک کرد آیا پرمیشن وجود داره یا خیر، ولی نمیشه پرمیشن گرفت. راهش هم همین بالاست. (7 سال پیش)
0 0
ممنون حل شد (7 سال پیش)
0 0
سلام.ببخشید چجوری باید ازش استفاده کرد؟ (7 سال پیش)
+1 0
توضیحات آقای حاج حسینی کامل مرحله به مرحله پیش برید حتما جواب میگیرید (7 سال پیش)
+1 0
برای کلاس G از این متد استفاده میکنم اما تو این خط ActivityCompat.requestPermissions(activity, new String[]{permission}, 1); اررور nullPointerException میده..ممنون میشم منو راهنمایی کنید. (7 سال پیش)
+2 0
بله کاملا درسته. طبق توضیحی که زیر کدها نوشتم، توی سرویس یا کلاس G نمیتونید درخواست پرمیشن کنید. برای این کار توی کلاس G بررسی کنید که آیا پرمیشن گرفته شده یا خیر، اگر نشده بود یک فلگ رو فالس کنید. توی کدهای اکتیویتی چک کنید اگر فلگ true بود که هیچ اگر نه پرمیشن بگیرید. (پیشنهاد من اینه که این کارها رو مستقیما توی اکتیویتی انجام بدید، نه توی کلاس G) (7 سال پیش)
0 0
برای استفاده در کلاس G میشه بیشتر توضیح بدین، من نتونستم در کلاس G پیاده سازیش کنم....ممنون (7 سال پیش)
0 0
توی پست دوم توضیح دادم دوست عزیز. توی کلاس G فقط میتونید چک کنید که پرمیشن داره یا خیر (7 سال پیش)
0 0
اره خوندم ولی همین چک کردن رو نمی دونم چطور انجام بدم (7 سال پیش)
+1 0
تمامی موارد بالا رو باید انجام بدید، کدهای این پست رو هم به کلاس PermissionHandler اضافه کنید و بعد زمانی که میخواید ازش استفاده کنید، context رو به کلاس پاس بدید. (7 سال پیش)
0 0
سلام من تازه کارم . من میخوام از Camera و سرویسش استفاده کنم منتها با این خطا تو لاگ مواجه میشم java.lang.RuntimeException: Fail to connect to camera service الان دیه نمیدونم واقعا باید چیکار کنم همه کارای بالا رو هم انجام دادم لطفا راهنمایی کنید . مرسی (6 سال پیش)
پاسخ به سوال 
مهدی  7 سال پیش
+1 0

چرا در برنامه من AppCompatActivity شناخته نمیشه؟

0 0
کتابخونه شو به گریدل اضافه کن (7 سال پیش)
0 0
به احتمال زیاد شما از اکلیپس استفاده میکنید. توی اکلیپس باید کتابخانه هارو دستی اضافه کنید، ولی اندروید استادیو اتوماتیک AppCompatActivity رو میشناسه (7 سال پیش)
پاسخ به سوال 
مهدی  7 سال پیش
0 0

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

 

 

+1 0
والا من 1.5 سالی میشه که از اکلیپس استفاده نمیکنم و یادم نیست چجوری بود، ولی برای این کار تاپیک های زیادی داشتیم اون زمان، میتونید توی انجمن سرچ کنید (7 سال پیش)
پاسخ به سوال 
Reza  7 سال پیش
0 0

پاسخ به سوال 
Reza  7 سال پیش
0 0

پاسخ به سوال 
tiam  7 سال پیش
+3 0

اینم یه نمونه کد با ارسال آرایه ای از پرمیشن ها برای دوستان

public class ActivityMain extends ActivityBase {
private static int SECTION_COUNT;
private static String[] PERMISSIONS_SDCARD = {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};

public static ArrayList<StructSection> sections = new ArrayList<StructSection>();
private StructSection section;

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



new PermissionHandler().checkPermission(ActivityMain.this,
PERMISSIONS_SDCARD, new PermissionHandler.OnPermissionResponse() {
@Override
public void onPermissionGranted() {
// permission granted
// your code
//prepareDB();
populatedFromDatabase();

}

@Override
public void onPermissionDenied() {
// User canceled permission
Toast.makeText(ActivityMain.this, R.string.conecpt_permission, Toast.LENGTH_LONG).show();
}
});
0 0
من اینو که داخل اکلیپس وارد می کنم به مشکل می خورم ....امکان هست فایل کامل رو بفرستین که ایمپورت کنم؟؟ (7 سال پیش)
پاسخ به سوال 
h_uk2009  7 سال پیش
0 0

دوست گرامی میشه یک روشی بگی راحت یکجوری هست که همه برنامه های جدید اولش از آدم میپرسه دسترسی ها رو موقع ورود و دیگه هم نمیخواد. میشه اون روشو بگید چیکار کنیم ؟

پاسخ به سوال 
Hajhosseini  7 سال پیش
+2 0

به صورت ساده به این شکل میشه:

if (Build.VERSION.SDK_INT >= 23) {
                if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
                        Log.v("TAG", "Permission is granted");
                } else {
                    ActivityCompat.requestPermissions(activity, permission, 1);
                    Log.v("TAG", "Request permission");
                }
        } else {
            //permission is automatically granted on sdk<23 upon installation
            Log.v("TAG", "Permission is granted");
        }
0 0
درود بر شما (7 سال پیش)
0 0
برای اضافه کردن پرمیژن ها باید حتما از کتابخونه خاصی استفاده کنیم؟! لینک کتاب خونه رو کسی داره ممنون میشم قرار بده (7 سال پیش)
0 0
سوال ببخشید باز ! به غیر کارایی که گفتی بالا باید این کار آخرو بکنم که اولش همه پرمیشن ها رو بگیره ؟ (7 سال پیش)
0 0
آقای مهندس حاج حسینی روی چند پرمیشن مشکل داره فقط یکی از دسترسی ها میفته توی حلقه و بقیه رو نمیپرسه چک کردم . باید چیکار کرد (7 سال پیش)
0 0
سلام ، خط i = permission.length; رو کامنت کنید ببینید درست میشه ؟ (7 سال پیش)
0 0
نه بازم درست نشد (7 سال پیش)
+2 0
سلام. توی این قطعه کد که حلقه وجود نداره. شما میتونید خودتون یک متد ریکرسیو درست کنید و دونه دونه درخواست پرمیشن بدید. به این صورت که اول یک آرایه + ایندکس مورد نظر (بار اول 0 هست) رو به یک متد پاس میدید، بعد اگر پرمیشن نداد، دوباره همین متد رو با همین پارامترا کال میکنید، اگر پرمیشن داد میرید سره پرمیشن بعدی. (7 سال پیش)
0 0
خوب اگر قرار بود که توی حلقه بیفته چرا شما اومدی و دو حالت checkpermision تابع نوشتی .. یکی تکی و یکی گروهی. اگر گروهی هم قراره که توی حلقه بندازیم خودمون دستی باید فقط یک تابع عملا مینوشتی و میگفتی آقا و خانم عزیز شما باید با تابع ریکرسیو داده ها رو صدا بزنی. ولی در هر صورت من از شما تشکر میکنم مهندس تابع زیبایی هست ولی کاش کاملتر میشد و میزاشتید. ممنون (7 سال پیش)
+2 0
منظور من این پاسخ هست. دوستان گفتن به طور خلاصه چجوری میشه، اینجا خلاصه رو نوشتیم. در پاسخ های بالا توضیحات داده شده، تنها مشکلی که داره اینه که کاربر پرمیشن اول رو اگر اوکی نزنه ولی دومی رو اوکی بزنه، متد کال نمیشه، ولی تمام پرمیشن هارو میگیره پشت سر هم. برای رفع این مشکل هم میتونید از تابع ریکرسیو استفاده کنید. این تاپیک 9 ماه پیش باز شده و بد نیست شما و دیگر دوستان هم در اون فعالیت داشته باشید. در حال حاضر متاسفانه زمان ندارم متد رو بنیسم، اگر شما زمانش رو دارید ممنون میشم در پایین تاپیک اضافه کنید. بحث اینجاست که تعداد خیلی زیادی از دوستان از طریق شماره تلگرام و یا پیام های اینجا به من اطلاع میدن که نیاز به راهنمایی دارن و مسلما جوابگویی میتونه در حد راهنمایی برای همه باشه، ولی نمیتونم برای همه کد بنویسم. الان سوالات دوستان روزانه بالای 2-3 مورده. شما خودتون رو بذارید جای من... (7 سال پیش)
پاسخ به سوال 
oMiD4gApp  7 سال پیش
0 0

سلام..من کتابخونه support.v7.app.AppCompatActivity رو اضافه کردم و کلاس بیس اکتیویتی رو ساختم اما این ارورهارو میده!

فقط اینکه من از api 15  استفاده میکنم و توی support.v7.app.AppCompatActivity هم روی 15 گذاشتم ، پروژم هم روی همین نسخه ساختم

مشکل کجاست؟ و ایا باید پروژه support.v7.app.AppCompatActivity رو ببندم وقتی در پروژه ای ازش استفاده میکنم؟

+3 0
اگر از اندروید استادیو استفاده میکنید، گریدل درست بیلد نشده، اگر از اکلیپس، کتابخونه ها رو درست اد نکردید یا با هم کانفلیکت دارن (7 سال پیش)
+1 0
نمیتونه مشکل از این باشه؟ ((فقط اینکه من از api 15 استفاده میکنم و توی support.v7.app.AppCompatActivity هم روی 15 گذاشتم ، پروژم هم روی همین نسخه ساختم))؟ و ایا annotation هم کتابخونست؟ راه دیگه و راحتری نداره ما مشکل پروژمون رو حل کنیم..خیلی گیرم (7 سال پیش)
+1 0
سلام ، منم این مشکل رو دارم ، و مثل پاسخی که آقا مهدی بالاتر گذاشتن ، پکیج appcompat خالیه ، برای همین کلاس AppCompatActivity رو نمیشناسه . کتابخونه درست اد شده چون جاهای دیگه ازش استفاده کردم !!! (7 سال پیش)
پاسخ به سوال 
Hajhosseini  7 سال پیش
+3 0

دوستان باید توی گریدل خط پایین (یک ورژنش رو) ایمپورت کنید.

 compile 'com.android.support:appcompat-v7:23.1.1'

در هر صورت اگر 1% هیچ راهی پیدا نکردید، میتونید از ActionbarActivity یا FragmentActivity اکستندز کنید. اگر اصن فرگمنت ندارید و نیازی به این کتابخانه هم ندارید میتونید از Activity اکستندز کنید. در هر صورت این مشکل به روش های زیادی قابل حله

+1 0
ممنون ، خب مشکل اینه که هیچ کدوم از انواع اکتیویتی متد Override شده ای به نام onRequestPermissionsResult ندارن . با هزار زحمت یه نسخه از android.support.v7.appcompat رو گیر آوردم و ایمپورت کردم و AppCompatActivity رو شناخت ، ولی بازم متد onRequestPermissionsResult رو نداره ! یعنی هیچکس از اکلیپس استاد استفاده نمیکنه که بگه چیکار کنیم ؟! (7 سال پیش)
+1 0
دقیقا مشکل منم همینه و با اکلیپس نسخه استاد کار میکنم ، برنامم کامل هست و فقط همین بخشش مونده :( (7 سال پیش)
+3 0
والا چی بگم. به نظرم بهتره از اندروید استادیو استفاده کنید. حدود یک سالی هست که اپدیت ها برای آخرین نسخه اکلیپس هم نمیان، چه برسه نسخه استاد. (7 سال پیش)
+1 0
خب اینم یک راهیه اما من یه نسخه اندروید استادیو دارم که به زور میتونم بازش کنم (بخاطر سخت افزار ضعیف سیستمم) و حتی شبیه ساز اصلا اجرا نمیشه! ضمنا اینکه شخصی که کلا اکلیپس کار کرده به این مشکل که برخورد بخواد بیاد سمت اندروید استادیو تا بخواد باهاش اشنا بشه و ... خودش کلی زمان میبره (7 سال پیش)
+1 0
بنظرم بصورت یک درخواست از اساتید اقای کاشی زاده یا اقا جانی بخوایم یه پست بزنن و اینو حل بکنن شاید حل بشه (7 سال پیش)
پاسخ به سوال 
iranvisual  7 سال پیش
0 0

سلام بر دوست عزیز

خیلی ممنون از کدی که نوشتی

برنامه من از صفحه اسکرین شات میگیره و به عنوان یه فایل jpg ذخیرش میکنه

من کدی رو که گذاشتین رو تو برنامم گذاشتم و یه مشکلی هست

اونم اینه که من وقتی برنامه رو نصب میکنم برای اولین بار از من درخواست پریمیژن رو میکنه که منم Allow رو می زنم ولی برنامه کار نمی کنه

ولی وقتی یه بار برنامه رو میبندم دوباره بازش میکنم برنامه کار میکنه میخوام ببینم دلیلش چیه !!!

فقط باید تاکید کنم فقط برای اولین بار کار نمیکنه واقعا ممنون میشم کمک کنید

public class TakeScreenshot extends AppCompatActivity {

private ScrollView vScroll;
private HorizontalScrollView hScroll;
private float mx, my;

String myDate , filename;
LayoutInflater inflater;
long num ;
File path;
File imageFile ;
FileOutputStream outputStream;


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




vScroll = (ScrollView) findViewById(R.id.vScroll);
hScroll = (HorizontalScrollView) findViewById(R.id.hScroll);
inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);

}

public void CLICK (View v){

}



@Override
public boolean onTouchEvent(MotionEvent event) {
float curX, curY;

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:
mx = event.getX();
my = event.getY();
break;
case MotionEvent.ACTION_MOVE:
curX = event.getX();
curY = event.getY();
vScroll.scrollBy((int) (mx - curX), (int) (my - curY));
hScroll.scrollBy((int) (mx - curX), (int) (my - curY));
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
curX = event.getX();
curY = event.getY();
vScroll.scrollBy((int) (mx - curX), (int) (my - curY));
hScroll.scrollBy((int) (mx - curX), (int) (my - curY));
break;
}

return true;
}
public void btnSavePDF (View v){

new MaterialDialog.Builder(this)
.title("Creating PDF")
.content("Enter file name")
.input("Example : abc", null, new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog dialog, CharSequence input) {
if (input == null) {
Toast.makeText(getApplicationContext(), "Name cannot be blank", Toast.LENGTH_LONG).show();
} else {
filename = input.toString();



takeScreenshot();


}
}
})
.show();
}

private void takeScreenshot() {
Date now = new Date();
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
new PermissionHandler().checkPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionHandler.OnPermissionResponse() {
@Override
public void onPermissionGranted() {
// permission granted
path = new File(Environment.getExternalStorageDirectory(), "PICTURSSS");
if (!path.exists()) {
path.mkdir();
}
}

@Override
public void onPermissionDenied () {
// User canceled permission
}

});

try {
Bitmap bitmap = Bitmap.createBitmap(hScroll.getChildAt(0).getWidth(),
vScroll.getChildAt(0).getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// canvas.scale(2.0f,2.0f);

hScroll.getChildAt(0).draw(canvas);
vScroll.getChildAt(0).draw(canvas);

SimpleDateFormat format= new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
myDate = format.format(new Date());
num = Long.parseLong(myDate);

// File imageFile = new File(path,"JPG"+num +".jpg");
new PermissionHandler().checkPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, new PermissionHandler.OnPermissionResponse() {
@Override
public void onPermissionGranted() {
// permission granted
imageFile = new File(path,filename +".jpg");
try {
outputStream = new FileOutputStream(imageFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

@Override
public void onPermissionDenied () {
// User canceled permission
}

});


int quality = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
outputStream.flush();
outputStream.close();

openScreenshot(imageFile);
} catch (Throwable e) {

e.printStackTrace();
}
}
private void openScreenshot(File imageFile) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(imageFile);
intent.setDataAndType(uri, "image/*");
startActivity(intent);
}
}
پاسخ به سوال 
Hajhosseini  7 سال پیش
+1 0

این کدهارو هم

int quality = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
outputStream.flush();
outputStream.close();

openScreenshot(imageFile);

باید توی متد onPermissionGranted بنویسید

پاسخ به سوال 
Miaad  7 سال پیش
0 0

طریقه چک پرمیشن و  گرفتن پرمیشن داخل فرگمنت ها چطوره مثلا من بخوام برای فایند لوکیشن  پرمیشن بگیرم به چه صورت هست ؟؟!!   مثلا بخوام پرمیشن پیدا کردن مکان رو با روش شما برم جلو چیکار کنم ؟؟!

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkLocationPermission();
}





public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
public boolean checkLocationPermission(){
if (ContextCompat.checkSelfPermission(getActivity(),
android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {

// Asking user if explanation is needed
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
android.Manifest.permission.ACCESS_FINE_LOCATION)) {

// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.

//Prompt the user once explanation has been shown
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);


} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);
}
return false;
} else {
return true;
}
}




چطروی با روش شما برای پرمیشن گرفتن جلو برم ؟!! ممنونم اگر کمکی کنید

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