اذهب إلى المحتوى
  • 0

كيفية مشاركة الصوره من تطبيق flutter الى تطبيقات خارجية اخرى

Flutter Dev

السؤال

تحيه  طيبه للجميع 

لدي تطبيق أقوم من خلاله بعرض صوره للمستخدم هذا الصورة تم مسابقا تخزينها على قاعدة البيانات على السيرفر الان انا احتاج بعد عرض الصور تمكين المستخدم من مشاركة هذا الصورة لدى تطبيقات الأخرى مثل واتساب فيس بوك وغيرها.

انا اجلب الصورة من خلال الكود التالي:

 Future MakeShare() async {
var response = await http.get(
    Uri.parse("https://*********/ImageMakeShare.php?ID=" + widget.IDS.toString()),
    headers: {"Accept": "application/json"});

setState(() {

  var convertDataToJson = json.decode(response.body);
  dataImage = convertDataToJson['result'];
  if (dataImage != null) {

    imageMaine = dataImage[0]['image'];

}}); }

قمت باستعمال المكتبة التالية من فلاتر للمساعدة في مشاركة الصورة:

share_plus

بشكل التالي:

await Share.shareFiles([imageMaine ], text: 'Image Shared');

ولكني احصل على الخطاء التالي:

E/flutter (10763): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(https:/*******0ee2e.png (No such file or directory), null, null, null)

 

أقوم باستعماله بشكل التالي:

   FlatButton(
                                onPressed: () async {
                                  
                                  await Share.shareFiles(imageMaine,
                                      text: 'Image Shared');
                                 
                                },
                                child: Column(
                                  children: <Widget>[
                                    Icon(
                                      Icons.share,
                                      size: 25,
                                    ),
                                  
                                  ],
                                ),
                              ),

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 2 دقائق مضت قال Wael Aljamal:

أين تقوم بتعريف المتغير imageMaine؟ يجب أن يكون مرئي لكامل Wedgit  لتستطيع الوصول إليه

اهلا اخي الكريم 

عامل var imageMaine اعلى Future MakeShare() async 

 

هو مرئي بشكل جيد واستطيع مشاهدة رابط الصوره من خلال امر الطباعة ولكن الامر لا ينجح لدى كود المشاركة  استطيع الوصول له ايضا ولكن لو قمت بتشغيل يحصل الخطاء

تم التعديل في بواسطة مروان مروان3
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال مروان مروان3:

هو مرئي بشكل جيد واستطيع مشاهدة رابط الصوره من خلال امر الطباعة ولكن الامر لا ينجح لدى كود المشاركة  استطيع الوصول له ايضا ولكن لو قمت بتشغيل يحصل الخطاء

هل تأكدت من صلاحية الوصول لملف الصورة؟ لأن الخطأ يخبرنا أن وسيط المسار فارغ

هل إن قمت بعرض المسار هنا يظهر المسار بشكل صحيح

onPressed: () async {

	print	(imageMaine)

  await Share.shareFiles(imageMaine,
  text: 'Image Shared');

},

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Wael Aljamal:

هل تأكدت من صلاحية الوصول لملف الصورة؟ لأن الخطأ يخبرنا أن وسيط المسار فارغ

هل إن قمت بعرض المسار هنا يظهر المسار بشكل صحيح


onPressed: () async {

	print	(imageMaine)

  await Share.shareFiles(imageMaine,
  text: 'Image Shared');

},

 

مرحبا اخي الكريم

نعم قمت بعرض الصورة في هذا الموقع وهو يعود الي بنتيجة رابط الصورة  بشكل الصحيح

 

قمت بالبحث قليلا ومما فهمته انني بحاجه الى تحويل الصورة الى باث ثم استطيع مشاركتها او شيء من هذا القبيل حقيقه انا خبرتي ضعيفة في هذا المجال بمعنى لا نستطيع مشاركة الصورة بشكلها الصحيح هذا بل يجب تحويلها الى هيئة مختلفة تحتاج الى حفظ أولا في مسار الهاتف ثم مشاركتها او شيء من هذا القبيل 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال مروان مروان3:

نعم قمت بعرض الصورة في هذا الموقع وهو يعود الي بنتيجة رابط الصورة  بشكل الصحيح

أرجو إرفاق المسار الذي يظهر لديك.

القصد أن تكتب ملف الصورة القادمة من الاستعلام على شكل ملف و تعيد مساره 

    imageMaine = dataImage[0]['image'];

هذه بيانات صورة، ما المسار الذي تعيده؟ نريد مسار مخزن على الهاتف/تخزين التطبيق ليستطيع برنامج آخر قراءة الملف.

*****

بالنسبة للمثال من توثيق المكتية، تشارك المكتبة قائمة من مسارات ملفات الصور، لاحظ تعريف المتيغر 

List<String> imagePaths = [];

ثم عند إضافة صورة نضيف مسارها

if (pickedFile != null) {
  setState(() {
           imagePaths.add(pickedFile.path);
                         ^^^^^^^^^^^^^^^^^
});
}

ثم تتم مشاركة قائمة مسارات الملفات (الصور)

    if (imagePaths.isNotEmpty) {
      await Share.shareFiles(imagePaths,
                          ^^^^^^^^^^^^^^^
          text: text,

    }

مسار الصورة يجب أن يكون على الهاتف و ليس في المخدم المحلي

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال Wael Aljamal:

أرجو إرفاق المسار الذي يظهر لديك.

القصد أن تكتب ملف الصورة القادمة من الاستعلام على شكل ملف و تعيد مساره 


    imageMaine = dataImage[0]['image'];

هذه بيانات صورة، ما المسار الذي تعيده؟ نريد مسار مخزن على الهاتف/تخزين التطبيق ليستطيع برنامج آخر قراءة الملف.

*****

بالنسبة للمثال من توثيق المكتية، تشارك المكتبة قائمة من مسارات ملفات الصور، لاحظ تعريف المتيغر 


List<String> imagePaths = [];

ثم عند إضافة صورة نضيف مسارها


if (pickedFile != null) {
  setState(() {
           imagePaths.add(pickedFile.path);
                         ^^^^^^^^^^^^^^^^^
});
}

ثم تتم مشاركة قائمة مسارات الملفات (الصور)


    if (imagePaths.isNotEmpty) {
      await Share.shareFiles(imagePaths,
                          ^^^^^^^^^^^^^^^
          text: text,

    }

مسار الصورة يجب أن يكون على الهاتف و ليس في المخدم المحلي

اهلا اخي 

اقتباس

هذه بيانات صورة، ما المسار الذي تعيده؟ نريد مسار مخزن على الهاتف/تخزين التطبيق ليستطيع برنامج آخر قراءة الملف.

يعيد الي رابط الصورة من الاستضافة بشكل التالي:

https://**************/62a0ee2e.png

وليس من الهاتف

تم التعديل في بواسطة مروان مروان3
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 دقائق مضت قال مروان مروان3:

يعيد الي رابط الصورة من الاستضافة بشكل التالي:

سنقوم بتخزين الصورة محلياًثم نشارك مسارها.

سوف نعتمد على مكتبة flutter_cache_manager أو غيرها

  • getLocalPathForNetworkImage يخزن الصورة من الانترنت و يعيد رابط الملف الخاص بها في التطبيق
import 'dart:async';
import 'dart:io' as Io;
import 'package:image/image.dart';

import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';


Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

Future<Io.File> getLocalPathForNetworkImage(String url) async {
  
  var cacheManager = await CacheManager.getInstance();
  Io.File file = await cacheManager.getFile(url);
  return file.path;
}

أو طريقة أخرى

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';





final directory = (await getExternalStorageDirectory()).path;
File imgFile = File('$directory/imageToShare.png');
imgFile.writeAsBytesSync(imageMaine);

Share.shareFiles(['$directory/imageToShare.png']);

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 6 دقائق مضت قال Wael Aljamal:

سنقوم بتخزين الصورة محلياًثم نشارك مسارها.

سوف نعتمد على مكتبة flutter_cache_manager أو غيرها

  • getLocalPathForNetworkImage يخزن الصورة من الانترنت و يعيد رابط الملف الخاص بها في التطبيق

import 'dart:async';
import 'dart:io' as Io;
import 'package:image/image.dart';

import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';


Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

Future<Io.File> getLocalPathForNetworkImage(String url) async {
  
  var cacheManager = await CacheManager.getInstance();
  Io.File file = await cacheManager.getFile(url);
  return file.path;
}

أو طريقة أخرى


import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';





final directory = (await getExternalStorageDirectory()).path;
File imgFile = File('$directory/imageToShare.png');
imgFile.writeAsBytesSync(imageMaine);

Share.shareFiles(['$directory/imageToShare.png']);

 

 

 

مرحبا اخي الكريم

قمت بتطبيقها بشكل التالي:

 Future MakeShare() async {
    var response = await http.get(
        Uri.parse("https://************),
        headers: {"Accept": "application/json"});
      var convertDataToJson = json.decode(response.body);
      dataImage = convertDataToJson['result'];
      if (dataImage != null) {

     var  imageMaine = dataImage[0]['image'];
       final directory = (await getExternalStorageDirectory()).path;
       File imgFile = File('$directory/imageToShare.png');
       imgFile.writeAsBytesSync(imageMaine);
       Share.shareFiles(['$directory/imageToShare.png']);
    }
  }

وحصلت على الخطاء التالي:

 [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'String' is not a subtype of type 'List<int>'

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Wael Aljamal:

أين قمت بتعريف قائمة من int ؟ ما السطر الذي يسبب الخطأ؟

 لم اقم بتعريفة متغير من نوع رقم ولكن اعتقد ان المشكلة في هذا السطر مع الرقم صفر 0

dataImage[0]['image'];

المتغيرات الموجودة كالتالي:

List dataImage;
var imageMaine;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 دقائق مضت قال Wael Aljamal:

ما هي بنية dataImage 

قائمة اخي حتى استطيع عرض البيانات هيا تابعه لهذا الاسطر

  var convertDataToJson = json.decode(response.body);
      dataImage = convertDataToJson['result'];
      if (dataImage != null) {

       imageMaine = dataImage[0]['image'];

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 8 دقائق مضت قال مروان مروان3:

قائمة اخي حتى استطيع عرض البيانات هيا تابعه لهذا الاسطر

قائمة من عناصر Json أليس كذلك؟ 

إن كان رد السيرفر كائن واحد هل تعيد مصفوفة؟

جرب 

imageMaine = dataImage['image'];

ومن الأفضل لتعرف بنية الغرض أن تطبعه هكذا:

تضمين 
import 'dart:developer';

ثم
dataImage = convertDataToJson['result'];
inspect(dataImage);

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Wael Aljamal:

قائمة من عناصر Json أليس كذلك؟ 

إن كان رد السيرفر كائن واحد هل تعيد مصفوفة؟


جرب 

imageMaine = dataImage['image'];

ومن الأفضل لتعرف بنية الغرض أن تطبعه هكذا:


تضمين 
import 'dart:developer';

ثم
dataImage = convertDataToJson['result'];
inspect(dataImage);

 

يعيد لي محتويات سطر الصورة كامل كالتالي:

 [{Image_id: 506, image: https://***********6a0ee2e.png, PID: 516, pictureNum: 1}]

هذا السطر كامل من جدول البيانات طبعا هو يعيده حسب PID  الذي قمت بأرساله انا بمعنى انا طالب حسب هذا المعرف

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال مروان مروان3:

هذا السطر كامل من جدول البيانات طبعا هو يعيده حسب PID  الذي قمت بأرساله انا بمعنى انا طالب حسب هذا المعرف

تمام هو يعيد مصفوفة أي 

       imageMaine = dataImage[0]['image'];

يجب أن تعمل، هل كان الخطأ يظهر من قبل؟ ماالتعديل الذي سبب ظهوره

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 دقائق مضت قال Wael Aljamal:

تمام هو يعيد مصفوفة أي 


       imageMaine = dataImage[0]['image'];

يجب أن تعمل، هل كان الخطأ يظهر من قبل؟ ماالتعديل الذي سبب ظهوره

لما اعمل تتبع للخطاء من خلال تبويب run  يذهب بي الى هذا السطر من الكود الذي سبق وشاركته لدي

  imgFile.writeAsBytesSync(imageMaine);

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال مروان مروان3:

لما اعمل تتبع للخطاء من خلال تبويب run  يذهب بي الى هذا السطر من الكود الذي سبق وشاركته لدي


  imgFile.writeAsBytesSync(imageMaine);

 

اعتقد أن imageMain هو  ملف في أول مرة، لذلك هذه لا تعمل، 

أرجو استعمال الحل الأول

بتاريخ منذ ساعة مضت قال Wael Aljamal:

سنقوم بتخزين الصورة محلياًثم نشارك مسارها.

سوف نعتمد على مكتبة flutter_cache_manager أو غيرها

  • getLocalPathForNetworkImage يخزن الصورة من الانترنت و يعيد رابط الملف الخاص بها في التطبيق

import 'dart:async';
import 'dart:io' as Io;
import 'package:image/image.dart';

import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';


Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

Future<Io.File> getLocalPathForNetworkImage(String url) async {
  
  var cacheManager = await CacheManager.getInstance();
  Io.File file = await cacheManager.getFile(url);
  return file.path;
}

 

 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...