رفتن به مطلب
  • 0

انتخاب فایل توسط کاربر


DexterFstone

سوال

درود

نحوه نمایش فایل پیکر ب چ صورت هست ترجیحا با اینتنت

میخوام کاربر بتونه فایل پی دی اف انتخاب کنه و بعد ب سرور ارسال کنم

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

13 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

از این کتابخونه میتونین استفاده کنین 

https://github.com/DroidNinja/Android-FilePicker

قابلیت انتخاب نوع فایل  هم داره

String zipTypes = {"zip","rar"};
   addFileSupport("ZIP",zipTypes, R.drawable.ic_zip_icon);

برای pdf 

String pdffiles = {"pdf"};
   addFileSupport("Pdf",pdffiles, R.drawable.icon_pdf);

اگه هم اینتنت خیلی ساده میخواین ، خیلی راحت با کد زیر اینتنت رو اجراکنین

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
// baraye pdf :  i.setType("application/pdf");
    startActivityForResult(intent, CODE);
}

بعد از انتخاب فایل : 

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String addressFile = data.getDataString();
    // ....
    super.onActivityResult(requestCode, resultCode, data);

}

 

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

در ۱۴۰۲/۲/۳۱ در 11:20، امین شاهدی گفته است:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String addressFile = data.getDataString();
    // ....
    super.onActivityResult(requestCode, resultCode, data);

}

بعد ببخشید من دارم از کلاس استفاده میکنم برای تبدیلش ب کتابخانه در کلاس این ب چ صورت میشه صدا زدنش باید intent یا getActivity راب چیزی متصل کنم یا داخل کلاس ب همین شکل بنویسمش؟

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

هم اکنون، DexterFstone گفته است:

بعد ببخشید من دارم از کلاس استفاده میکنم برای تبدیلش ب کتابخانه در کلاس این ب چ صورت میشه صدا زدنش باید intent یا getActivity راب چیزی متصل کنم یا داخل کلاس ب همین شکل بنویسمش؟

باید context یا اکتیویتی رو بگیرین ، اگه از core بیسیک استفاده میکنین (یعنی کتابخونه بیسیک میسازین) میتونین از کلس BA بگیرین 

	private BA baclass;
	
	
	public void Initialize(BA ba){
		this.baclass = ba;
	}

زمان اینیشیالایز یه کلس BA روبگیرین ، زمانی که کتابخانه تو بیسیک استفاده بشه کاربر اینو نمیبینه و خود بیسیک به صورت اتومات این مورد رو وارد میکنهو ازون میتونین اکتیویتی و یا context رو بگیرین و اینتنت رو اجرا کنید

	public void runIntent(){
	    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
	    i.setType("*/*");
	    baclass.activity.startActivityForResult(intent, CODE);
	}

اگه هم کتابخونه رو برای جاوا میسازین به صورت زیر بگیرین

	private Activity activity;

	public YourClassName(Activity act){
		this.activity = act;
	}
	public void runIntent(){
	    activity.startActivityForResult(intent, requestCode);
	}

اگه جایی رو متوجه نشدین بگین که بیشتر توضیح بدم

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

در ۱۴۰۲/۳/۱۴ در 14:55، امین شاهدی گفته است:

اگه جایی رو متوجه نشدین بگین که بیشتر توضیح بدم

سلام مجدد خب ببینید تا الان همه چی اوکی فقط میمونه ی مشکل اونم آدرسی که بازگشت داده میشه

آدرس به این صورت برای مثال

content://com.android.externalstorage.douments/document/primary%3ATest.apk

خب الان اینجا مثلا فایل test.apk انتخاب کردم ولی خب مسیر کاملا عجیبی داره و برنامه من نمیونه اینا بخونه

برنامه من مسیر را اینطوری قبول میکنه

externalstorage/douments/Test.apk

الان راهی هست که آدرس به چنین چیزی تبدیل کرد؟ یا نمیشه مستقیم بایت های فایل دریافت کرد؟

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

6 ساعت قبل، DexterFstone گفته است:

سلام مجدد خب ببینید تا الان همه چی اوکی فقط میمونه ی مشکل اونم آدرسی که بازگشت داده میشه

آدرس به این صورت برای مثال

content://com.android.externalstorage.douments/document/primary%3ATest.apk

خب الان اینجا مثلا فایل test.apk انتخاب کردم ولی خب مسیر کاملا عجیبی داره و برنامه من نمیونه اینا بخونه

برنامه من مسیر را اینطوری قبول میکنه

externalstorage/douments/Test.apk

الان راهی هست که آدرس به چنین چیزی تبدیل کرد؟ یا نمیشه مستقیم بایت های فایل دریافت کرد؟

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

 public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    String docId = DocumentsContract.getDocumentId(uri);
    String[] split = docId.split(':');
    String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
        return Environment.getExternalStorageDirectory() + "/" + split[1];
    } else {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            //getExternalMediaDirs() added in API 21
            File[] external = context.getExternalMediaDirs();
            if (external.length > 1) {
                filePath = external[1].getAbsolutePath();
                filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
            }
        } else {
            filePath = "/storage/" + type + "/" + split[1];
        }
        return filePath;
}

اگه نشد از کلس ها و متد های این صفحه ها استفاده کنید : 

https://stackoverflow.com/questions/17546101/get-real-path-for-uri-android/61995806#61995806

https://stackoverflow.com/questions/73245094/how-to-read-files-from-external-storage-documents-in-android-10

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

10 ساعت قبل، امین شاهدی گفته است:

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

 public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    String docId = DocumentsContract.getDocumentId(uri);
    String[] split = docId.split(':');
    String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
        return Environment.getExternalStorageDirectory() + "/" + split[1];
    } else {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            //getExternalMediaDirs() added in API 21
            File[] external = context.getExternalMediaDirs();
            if (external.length > 1) {
                filePath = external[1].getAbsolutePath();
                filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
            }
        } else {
            filePath = "/storage/" + type + "/" + split[1];
        }
        return filePath;
}

اگه نشد از کلس ها و متد های این صفحه ها استفاده کنید : 

https://stackoverflow.com/questions/17546101/get-real-path-for-uri-android/61995806#61995806

https://stackoverflow.com/questions/73245094/how-to-read-files-from-external-storage-documents-in-android-10

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

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

بالاتر گفتم بهتون اگه دقت میکردین

 

context یا اکتیویتی رو 2راه هست که بگیرین، اگه از core بیسیک استفاده میکنین (یعنی کتابخونه بیسیک میسازین) میتونین از کلس BA بگیرین 
 

	private BA baclass;
	
	
	public void Initialize(BA ba){
		this.baclass = ba;
	}

زمان اینیشیالایز یه کلس BA روبگیرین ، زمانی که کتابخانه تو بیسیک استفاده بشه کاربر اینو نمیبینه و خود بیسیک به صورت اتومات این مورد رو وارد میکنهو ازون میتونین اکتیویتی و یا context رو بگیرین و اینتنت رو اجرا کنید
 

و بعد میتونین از ba بگیرین : 

		baclass.context
		baclass.applicationContext

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

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

خیلی ممنون این مورد هم به لطف شما رفع شد

فقط یک مورد دیگه باقی میمونه اونم اینکه ظاهرا به فایل و کلا به اطلاعات حافظه دسترسی ندارم و وقتی مسیر هم میدم بم null برمیگردونه اطلاعات فایلا

برای دسترسی گرفتن چه حافظه داخلی چه حافظه خارجی باید چ کار کرد؟

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

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

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

دسترسی برای جابجایی و حدف و تغییر فایل 

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

این کد رو هم به تگ اپلیکیشن اضافه کنید

android:requestLegacyExternalStorage="true"

برای گرفتن دسترسی رانتایم از کد زیر استفاده کنید

private void requestPermission() {
    if (SDK_INT >= Build.VERSION_CODES.R) {
        try {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
            startActivityForResult(intent, 2296);
        } catch (Exception e) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            startActivityForResult(intent, 2296);
        }
    } else {
        //below android 11
        ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }
}

 

جواب اینتنت بالا توی اندروید بالای 11 توی کد زیر میاد (اگه قبلا متد onActivityResult رو اضافه کردین فقط شرط داخلش رو کپی کنین و به متد onActivityResult  اضافه کنید )

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2296) {
        if (SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                // dastrasi dade shod
            } else {
               //dastrasi dade nashod , dobare az karbar darkhast konin
            }
        }
    }
}

 

و برای اندروید زیر 11 توی کد زیر

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0) {
                boolean READ_EXTERNAL_STORAGE = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean WRITE_EXTERNAL_STORAGE = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                if (READ_EXTERNAL_STORAGE && WRITE_EXTERNAL_STORAGE) {
                    // perform action when allow permission success
                } else {
                    Toast.makeText(this, "Allow permission for storage access!", Toast.LENGTH_SHORT).show();
                }
            }
            break;
    }
}

 

این هم کد برای چک کردن دسترسی : 

private boolean checkPermission() {
    if (SDK_INT >= Build.VERSION_CODES.R) {
        return Environment.isExternalStorageManager();
    } else {
        int result = ContextCompat.checkSelfPermission(PermissionActivity.this, READ_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(PermissionActivity.this, WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }

اگه true بودیعنی همه دسترسی ها داده شده

 

فقط یه نکته اگه برنامه شما فایل منیجر یا آنتی ویروس و این سبک اپلیکیشن ها نباشه ممکنه به دسترسی MANAGE_EXTERNAL_STORAGE  گیر بدن (مخصوصا تو گوگل پلی)

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

سلام ودرود.

از کتابخونه phone و کلاس contentchooser استفاده کنید

https://www.b4x.com/android/help/phone.html#contentchooser

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

۱ ساعت قبل، محمدرضا شاهپیری گفته است:

سلام ودرود.

از کتابخونه phone و کلاس contentchooser استفاده کنید

https://www.b4x.com/android/help/phone.html#contentchooser

استاد ولی برای اندروید استودیو میخواستم

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

برای استفاده از این موردی که فرمودید دسترسی خاصی باید دریافت بشه از کاربر؟

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

21 ساعت قبل، DexterFstone گفته است:

برای استفاده از این موردی که فرمودید دسترسی خاصی باید دریافت بشه از کاربر؟

خیر ، فقط برای استفاده از کتابخاونه که لینک دادم اگه تارگت برنامه  29 باشه کد زیر رو به منیفست اضافه کنید (30 نیازی نیست و 28 هم همینطور ، فقط و فقط اگه تارگت برنامه 29 باشه)

android:requestLegacyExternalStorage="true"

 

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

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...