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

انتخاب عکس از حافظه


MR.B4A

سوال

سلام

این دستورات من برای انتخاب یک تصویر از حافظه و نمایش آن در ایمیج ویو هست

Sub Process_Globals
	Private c As ContentChooser
End Sub

Sub Globals
	Private r As RuntimePermissions
	Private ImageView1 As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	
	r.CheckAndRequest(r.PERMISSION_READ_EXTERNAL_STORAGE)
	r.CheckAndRequest(r.PERMISSION_WRITE_EXTERNAL_STORAGE)
	
	c.Initialize("cc")
End Sub

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
	If Result = False Then
		Msgbox("شما اجازه دسترسی به حافظه را به این برنامه نداده اید و در اینصورت ممکن است برخی از بخش های برنامه به درستی کار نکنند","")
	End If
End Sub

Private Sub cc_Result (Success As Boolean, Dir As String, FileName As String)
	If Success Then
		Dim uriImage As String = GetPathFromContentResult(FileName)
		ImageView1.SetBackgroundImage(LoadBitmapSample("",uriImage,ImageView1.Width,ImageView1.Height))
	End If
End Sub

Sub GetPathFromContentResult(UriString As String) As String
	If UriString.StartsWith("/") Then Return UriString 'If the user used a file manager to choose the image
	Dim Cursor1 As Cursor
	Dim Uri1 As Uri
	Dim Proj() As String = Array As String("_data")
	Dim cr As ContentResolver
	cr.Initialize("")
	If UriString.StartsWith("content://com.android.providers.media.documents") Then
		Dim i As Int = UriString.IndexOf("%3A")
		Dim id As String = UriString.SubString(i + 3)
		Uri1.Parse("content://media/external/images/media")
		Cursor1 = cr.Query(Uri1, Proj, "_id = ?", Array As String(id), "")
	Else
		Uri1.Parse(UriString)
		Cursor1 = cr.Query(Uri1, Proj, "", Null, "")
	End If
	Cursor1.Position = 0
	Dim res As String
	res = Cursor1.GetString("_data")
	Cursor1.Close
	Return res
End Sub

Private Sub Button1_Click
	c.Show("image/*","Choose Image")
End Sub

اما نمیدونم چرا توی اندروید 6 و بالاتر خطای فورس کلوز میده!!

ممنون میشم راهنماییم کنید

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

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

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

در ۱۴۰۰/۱۲/۲۲ در 01:47، batman123 گفته است:

متوجه نشدم!!

ممنون میشم بیشتر توضیح بدید

وقتی شما از ContentChooser استفاده می کنید نیازی به دسترسی به حافظه ندارید. و یکی از مهم ترین مزیت هاش هم همین هستش

در حال خاضر و در دستگاه های جدید هم شما غیر از موارد و شرایط خاص نباید دسترسی به حافظه رو بگیرید.

برای انتخاب عکس مطمئنا نباید ان کار رو بکنید و روش های جایگزین مثل همین content chooser باید استفاده کنید

(چند روش مثل همین contentchooser هست که میتونید خواندن و نوشتن روی حافظه انجام بدین بدون دسترسی و از اون ها باید استفاده بشه الان دیگه..)

 

این که content chooser رو برای این کار انتخاب کردید انتخاب خوبیه ولی در ادامش کد های پیچیده و اشتباه استفاده کردید. اون کد ها همونطور که گفتید خطا هم میده

این کد ها قدیمی هستش و اشتباه هست و از این متد GetPathFromContentResult نباید و نیازی نیست استفاده کنید

Sub CC_Result (Success As Boolean, Dir As String, FileName As String)

content chooser یک dir و filename به شما میده.

اگه فیلم یا صدا هستش مستقیما معمولا میتونید در پخش کننده برنامتون استفاده کنید (اگه مشکلی بود از MediaPlayerStream وexoplayer استفاده کنید)

(این ادرس ها یعنی filename و dir موقتی هستش البته)

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

 

نام و جزئیات و اطلاعات دقیق تر فایل رو هم قبلش میتونید بگیرید.

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

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

سلام.

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

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

https://www.b4x.com/android/forum/threads/contentchooser-example-select-image-at-phone.109022/

 


Sub Process_Globals

	Dim CC As ContentChooser 'Phone Library
End Sub

Sub Globals

	Private ButtonGetImage As Button
	Private ImageView1 As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)

	Activity.LoadLayout("Layout1")

	CC.Initialize("CC")
	
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub ButtonGetImage_Click
	
	CC.Show("image/*", "Choose image")
	'CC.Show("audio/*", "Choose audio file")
	
End Sub

Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
	
	If Success = True Then
		ImageView1.Bitmap = LoadBitmap(Dir,FileName)
	Else
		ToastMessageShow("No Success :(",True)
	End If
		
End Sub

کپی کردن فایل هم یه همچین کدی هست

Dim  image As ContentChooser


Sub btnAlbumImg_Click
    image.Initialize("imgChooser")
    image.Show("image/*", "Choose image")
   
End Sub


Sub imgChooser_Result(Success As Boolean, Dir As String, FileName As String)
	If Success Then
   		Dim Out As OutputStream
        Out = File.OpenOutput(File.DirInternal , "filename.jpg", False)
        Dim Inp As InputStream = File.OpenInput(Dir , FileName)
        File.Copy2(Inp, Out)
        Out.Close
   	Else
   		ToastMessageShow("No image selected!", True)
	End If
End Sub

گرفتن اطلاعات فایل انتخاب شده

https://www.b4x.com/android/forum/threads/getting-file-info-using-uri-from-content-chooser-or-from-received-shared-file-example.117325/#content

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

در ۱۴۰۰/۱۲/۲۰ در ۱۴:۰۲، batman۱۲۳ گفته است:

سلام

این دستورات من برای انتخاب یک تصویر از حافظه و نمایش آن در ایمیج ویو هست

Sub Process_Globals
	Private c As ContentChooser
End Sub

Sub Globals
	Private r As RuntimePermissions
	Private ImageView1 As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	
	r.CheckAndRequest(r.PERMISSION_READ_EXTERNAL_STORAGE)
	r.CheckAndRequest(r.PERMISSION_WRITE_EXTERNAL_STORAGE)
	
	c.Initialize("cc")
End Sub

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
	If Result = False Then
		Msgbox("شما اجازه دسترسی به حافظه را به این برنامه نداده اید و در اینصورت ممکن است برخی از بخش های برنامه به درستی کار نکنند","")
	End If
End Sub

Private Sub cc_Result (Success As Boolean, Dir As String, FileName As String)
	If Success Then
		Dim uriImage As String = GetPathFromContentResult(FileName)
		ImageView1.SetBackgroundImage(LoadBitmapSample("",uriImage,ImageView1.Width,ImageView1.Height))
	End If
End Sub

Sub GetPathFromContentResult(UriString As String) As String
	If UriString.StartsWith("/") Then Return UriString 'If the user used a file manager to choose the image
	Dim Cursor1 As Cursor
	Dim Uri1 As Uri
	Dim Proj() As String = Array As String("_data")
	Dim cr As ContentResolver
	cr.Initialize("")
	If UriString.StartsWith("content://com.android.providers.media.documents") Then
		Dim i As Int = UriString.IndexOf("%3A")
		Dim id As String = UriString.SubString(i + 3)
		Uri1.Parse("content://media/external/images/media")
		Cursor1 = cr.Query(Uri1, Proj, "_id = ?", Array As String(id), "")
	Else
		Uri1.Parse(UriString)
		Cursor1 = cr.Query(Uri1, Proj, "", Null, "")
	End If
	Cursor1.Position = 0
	Dim res As String
	res = Cursor1.GetString("_data")
	Cursor1.Close
	Return res
End Sub

Private Sub Button1_Click
	c.Show("image/*","Choose Image")
End Sub

اما نمیدونم چرا توی اندروید 6 و بالاتر خطای فورس کلوز میده!!

ممنون میشم راهنماییم کنید

🙄 متوجه کد های خودتون نشدم. cc نه نیاز به دسترسی داره . نه نیاز به گرفتن ادرس دقیق. همون فولدر و فایلی که میده مستقیم استفاده کنید یا کپی کنید

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

در ۱۴۰۰/۱۲/۲۲ در 01:35، rasool.g گفته است:

🙄 متوجه کد های خودتون نشدم. cc نه نیاز به دسترسی داره . نه نیاز به گرفتن ادرس دقیق. همون فولدر و فایلی که میده مستقیم استفاده کنید یا کپی کنید

متوجه نشدم!!

ممنون میشم بیشتر توضیح بدید

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

بایگانی شده

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

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

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