واسط برنامهسازی کاربردی توسعهدهندگان Gemini به شما امکان میدهد به مدلهای Gemini در Google دسترسی داشته باشید و ویژگیهای هوش مصنوعی زایای پیشرفته را در برنامههای Android خود بسازید—ازجمله گپ مکالمهای، تولید تصویر (با Nano Banana)، و تولید نوشتار براساس ورودی نوشتار، تصویر، صدا، و ویدیو.
برای دسترسی به مدلهای Gemini Pro و Flash، میتوانید از Gemini Developer API با Firebase AI Logic استفاده کنید. این سرویس به شما امکان میدهد بدون نیاز به روش پرداخت (مانند کارت اعتباری) شروع کنید و یک سطح رایگان سخاوتمندانه ارائه میدهد. پساز اینکه ادغام خود را با یک پایگاه کاربری کوچک تأیید کردید، میتوانید با ارتقا به سطح پولی، آن را مقیاسبندی کنید.
شروع کردن
قبلاز اینکه مستقیماً از برنامهتان با Gemini API تعامل داشته باشید، باید ابتدا چند کار انجام دهید، ازجمله آشنایی با پیاموارهنویسی و همچنین راهاندازی Firebase و برنامهتان برای استفاده از کیت توسعه نرمافزار.
آزمایش با پیاموارهها
آزمایش کردن پیاموارهها میتواند به شما کمک کند بهترین عبارتبندی، محتوا، و قالب را برای برنامه Android خود پیدا کنید. Google AI Studio یک «محیط توسعه یکپارچه» (IDE) است که میتوانید از آن برای نمونهسازی و طراحی پیاموارهها برای موارد استفاده برنامهتان استفاده کنید.
ایجاد پیاموارههای مؤثر برای مورد استفاده شما مستلزم آزمایشهای گسترده است که بخش مهمی از این فرایند است. میتوانید درباره درخواست در اسناد Firebase بیشتر بدانید.
وقتی از پیاموارهتان راضی بودید، روی دکمه <> کلیک کنید تا تکهکدهای قابلافزودن به کدتان را دریافت کنید.
راهاندازی پروژه Firebase و متصل کردن برنامه به Firebase
وقتی آماده بودید که از برنامهتان با «میانای برنامهسازی کاربردی» تماس بگیرید، دستورالعملهای «مرحله ۱» در راهنمای شروع به کار Firebase AI Logic را دنبال کنید تا Firebase راهاندازی کنید و میاناهای برنامهسازی کاربردی و سرویسهای موردنیاز را فعال کنید.
افزودن وابستگیهای Gradle
وابستگیهای Gradle زیر را به واحد برنامه خود اضافه کنید:
کاتلین
dependencies {
// ... other androidx dependencies
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:firebase-bom:35.0.0"))
// Add the dependencies for the Firebase AI Logic and App Check libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
implementation("com.google.firebase:firebase-appcheck-debug")
}
جاوا
dependencies {
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:35.0.0"))
// Add the dependencies for the Firebase AI Logic and App Check libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
implementation("com.google.firebase:firebase-appcheck-debug")
// Required for one-shot operations (to use `ListenableFuture` from Guava Android)
implementation("com.google.guava:guava:31.0.1-android")
// Required for streaming operations (to use `Publisher` from Reactive Streams)
implementation("org.reactivestreams:reactive-streams:1.0.4")
}
پیکربندی ارائهدهنده اشکالزدایی «بررسی برنامه» برای توسعه محلی
از اوایل ژوئیه ۲۰۲۶، بهعنوان بخشی از گردش کار راهاندازی هدایتشده برای «منطق هوش مصنوعی» در کنسول Firebase، «بررسی برنامه Firebase» بهطور خودکار برای محافظت از Gemini API اعمال میشود. برای توسعه محلی، باید ارائهدهنده اشکالزدایی App Check را پیکربندی کنید تا گواهی را دور بزنید و درعینحال اجرای App Check را حفظ کنید.
در ساخت اشکالزدایی، App Check را پیکربندی کنید تا از کارخانه ارائهدهنده اشکالزدایی استفاده کند:
کاتلین
Firebase.initialize(context = this) Firebase.appCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance(), )جاوا
FirebaseApp.initializeApp(/*context=*/ this); FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); firebaseAppCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance());نمودار اشکالزدایی خود را دریافت کنید:
برنامهتان را در شبیهساز یا در دستگاه آزمایشیتان اجرا کنید.
در گزارشهایتان بهدنبال نشان اشکالزدایی «بررسی برنامه» بگردید. برای مثال:
D DebugAppCheckProvider: Enter this debug secret into the allow list in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678کد را کپی کنید (برای مثال،
123a4567-b89c-12d3-e456-789012345678).
ثبت کردن کد اشکالزدایی با App Check:
در کنسول Firebase، به امنیت > بررسی برنامه > برگه برنامهها بروید.
برنامهتان را پیدا کنید، روی منو سرریز () کلیک کنید، و سپس مدیریت نشانهای اشکالزدایی را انتخاب کنید.
برای ثبت کردن کد اشکالزدایی، دستورالعملهای روی صفحه را دنبال کنید.
برای جزئیات مربوط به ارائهدهنده اشکالزدایی (ازجمله نحوه دریافت کد اشکالزدایی جدید)، اسناد رسمی App Check را بررسی کنید.
راهاندازی مدل زایا
با نمونهسازی GenerativeModel و مشخص کردن نام مدل شروع کنید:
کاتلین
// Start by instantiating a GenerativeModel and specifying the model name: val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel("gemini-3.5-flash")
جاوا
GenerativeModel firebaseAI = FirebaseAI.getInstance(GenerativeBackend.googleAI()) .generativeModel("gemini-3.5-flash"); GenerativeModelFutures model = GenerativeModelFutures.from(firebaseAI);
درباره مدلهای دردسترس برای استفاده با Gemini Developer API بیشتر بدانید. همچنین میتوانید درباره پیکربندی پارامترهای مدل بیشتر بدانید.
تعامل با Gemini Developer API از نرمافزار
اکنون که Firebase و برنامهتان را برای استفاده از کیت توسعه نرمافزار راهاندازی کردهاید، آمادهاید از برنامهتان با Gemini Developer API تعامل برقرار کنید.
تولید نوشتار
برای تولید پاسخ نوشتاری، با پیاموارهتان با generateContent() تماس بگیرید.
کاتلین
scope.launch { val response = model.generateContent("Write a story about a magic backpack.") }
جاوا
Content prompt = new Content.Builder() .addText("Write a story about a magic backpack.") .build(); ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تولید نوشتار از تصاویر و رسانههای دیگر
همچنین میتوانید از پیاموارهای که شامل نوشتار بهعلاوه تصاویر یا رسانههای دیگر است نوشتار تولید کنید. وقتی با generateContent() تماس میگیرید، میتوانید رسانه را بهعنوان دادههای درونخطی ارسال کنید.
برای مثال، برای استفاده از یک بیتمپ، از نوع محتوای image استفاده کنید:
کاتلین
scope.launch { val response = model.generateContent( content { image(bitmap) text("what is the object in the picture?") } ) }
جاوا
Content content = new Content.Builder() .addImage(bitmap) .addText("what is the object in the picture?") .build(); ListenableFuture<GenerateContentResponse> response = model.generateContent(content); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
برای ارسال فایل صوتی، از نوع محتوای inlineData استفاده کنید:
کاتلین
scope.launch { val contentResolver = applicationContext.contentResolver contentResolver.openInputStream(audioUri).use { stream -> stream?.let { val bytes = it.readBytes() val prompt = content { inlineData(bytes, "audio/mpeg") // Specify the appropriate audio MIME type text("Transcribe this audio recording.") } val response = model.generateContent(prompt) } } }
جاوا
ContentResolver resolver = applicationContext.getContentResolver(); try (InputStream stream = resolver.openInputStream(audioUri)) { File audioFile = new File(new URI(audioUri.toString())); int audioSize = (int) audioFile.length(); byte[] audioBytes = new byte[audioSize]; if (stream != null) { stream.read(audioBytes, 0, audioBytes.length); stream.close(); // Provide a prompt that includes audio specified earlier and text Content prompt = new Content.Builder() .addInlineData(audioBytes, "audio/mpeg") // Specify the appropriate audio MIME type .addText("Transcribe what's said in this audio recording.") .build(); // To generate text output, call `generateContent` with the prompt ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String text = result.getText(); Log.d(TAG, (text == null) ? "" : text); } @Override public void onFailure(Throwable t) { Log.e(TAG, "Failed to generate a response", t); } }, executor); } else { Log.e(TAG, "Error getting input stream for file."); // Handle the error appropriately } } catch (IOException e) { Log.e(TAG, "Failed to read the audio file", e); } catch (URISyntaxException e) { Log.e(TAG, "Invalid audio file", e); }
و برای ارائه فایل ویدیو، به استفاده از نوع محتوای inlineData ادامه دهید:
کاتلین
scope.launch { val contentResolver = applicationContext.contentResolver contentResolver.openInputStream(videoUri).use { stream -> stream?.let { val bytes = it.readBytes() val prompt = content { inlineData(bytes, "video/mp4") // Specify the appropriate video MIME type text("Describe the content of this video") } val response = model.generateContent(prompt) } } }
جاوا
ContentResolver resolver = applicationContext.getContentResolver(); try (InputStream stream = resolver.openInputStream(videoUri)) { File videoFile = new File(new URI(videoUri.toString())); int videoSize = (int) videoFile.length(); byte[] videoBytes = new byte[videoSize]; if (stream != null) { stream.read(videoBytes, 0, videoBytes.length); stream.close(); // Provide a prompt that includes video specified earlier and text Content prompt = new Content.Builder() .addInlineData(videoBytes, "video/mp4") .addText("Describe the content of this video") .build(); // To generate text output, call generateContent with the prompt ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); System.out.println(resultText); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor); } } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); }
بههمین ترتیب، میتوانید اسناد PDF (application/pdf) و نوشتار ساده (text/plain) را نیز با ارسال «نوع MIME» مربوطه بهعنوان پارامتر ارسال کنید.
گپ چندنوبتی
همچنین میتوانید از مکالمههای چندنوبتی پشتیبانی کنید. گپی را با تابع
startChat() مقداردهی اولیه کنید. میتوانید بهصورت اختیاری سابقه پیام را به مدل ارائه دهید. سپس تابع sendMessage() را برای ارسال پیامهای گپ فراخوانی کنید.
کاتلین
val chat = model.startChat( history = listOf( content(role = "user") { text("Hello, I have 2 dogs in my house.") }, content(role = "model") { text("Great to meet you. What would you like to know?") } ) ) scope.launch { val response = chat.sendMessage("How many paws are in my house?") }
جاوا
Content.Builder userContentBuilder = new Content.Builder(); userContentBuilder.setRole("user"); userContentBuilder.addText("Hello, I have 2 dogs in my house."); Content userContent = userContentBuilder.build(); Content.Builder modelContentBuilder = new Content.Builder(); modelContentBuilder.setRole("model"); modelContentBuilder.addText("Great to meet you. What would you like to know?"); Content modelContent = modelContentBuilder.build(); List<Content> history = Arrays.asList(userContent, modelContent); // Initialize the chat ChatFutures chat = model.startChat(history); // Create a new user message Content.Builder messageBuilder = new Content.Builder(); messageBuilder.setRole("user"); messageBuilder.addText("How many paws are in my house?"); Content message = messageBuilder.build(); // Send the message ListenableFuture<GenerateContentResponse> response = chat.sendMessage(message); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); System.out.println(resultText); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تولید تصویر در Android با Nano Banana
بیشتر بدانیدمدلهای تصویر Gemini (یا مدلهای Nano Banana) میتوانند با بهرهگیری از دانش جهانی و استدلال، تصاویر تولید و ویرایش کنند. این مدلها تصاویر مرتبط با بافت تولید میکنند و بروندادهای نوشتار و تصویر را بهطور یکپارچه ترکیب یا درهمتنیده میکنند. همچنین میتوانند تصاویر دقیق با توالیهای نوشتاری طولانی تولید کنند و از ویرایش تصویری مکالمهای با حفظ بافت پشتیبانی میکنند.
این راهنما نحوه استفاده از مدلهای تصویر Gemini (مدلهای Nano Banana) را بااستفاده از Firebase AI Logic SDK برای Android شرح میدهد. جزئیات بیشتری درباره تولید تصویر با Gemini در اسناد Firebase پیدا کنید.
راهاندازی مدل زایا
GenerativeModel را نمونهسازی کنید و نام مدل «تصویر Gemini» را مشخص کنید (مثل
gemini-3.1-flash-image). سپس، responseModalities را پیکربندی کنید تا هم TEXT و هم IMAGE را دربرگیرد تا نوشتار و تصویر درهمتنیده تولید کند. اگر
TEXT را مستثنا کنید، مدل فقط تصویر برمیگرداند.
کاتلین
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( modelName = "gemini-3.1-flash-image", // Configure the model to respond with images (required) and text (optional) generationConfig = generationConfig { responseModalities = listOf( ResponseModality.TEXT, ResponseModality.IMAGE ) } )
جاوا
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel( "gemini-3.1-flash-image", // Configure the model to respond with text and images (required) new GenerationConfig.Builder() .setResponseModalities(Arrays.asList(ResponseModality.TEXT, ResponseModality.IMAGE)) .build() ); GenerativeModelFutures model = GenerativeModelFutures.from(ai);
تولید کردن تصویر (ورودی فقط نوشتار)
میتوانید با ارائه پیامواره فقط نوشتاری به مدل Gemini دستور دهید که تصویر تولید کند:
کاتلین
scope.launch { // Provide a text prompt instructing the model to generate an image val prompt = "A hyper realistic picture of a t-rex with a blue bag pack roaming a pre-historic forest." // To generate image output, call `generateContent` with the text input val generatedImageAsBitmap: Bitmap? = model.generateContent(prompt) .candidates.first().content.parts.filterIsInstance<ImagePart>() .firstOrNull()?.image }
جاوا
// Provide a text prompt instructing the model to generate an image Content prompt = new Content.Builder() .addText("Generate an image of the Eiffel Tower with fireworks in the background.") .build(); // To generate an image, call `generateContent` with the text input ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { // iterate over all the parts in the first candidate in the result object for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; // The returned image as a bitmap Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
ویرایش تصاویر (ورودی نوشتار و تصویر)
میتوانید از مدل Gemini بخواهید تصاویر موجود را با ارائه نوشتار و یک یا چند تصویر در پیاموارهتان ویرایش کند:
کاتلین
scope.launch { // Provide a text prompt instructing the model to edit the image val prompt = content { image(bitmap) text("Edit this image to make it look like a cartoon") } // To edit the image, call `generateContent` with the prompt (image and text input) val generatedImageAsBitmap: Bitmap? = model.generateContent(prompt) .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image // Handle the generated text and image }
جاوا
// Provide an image for the model to edit Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones); // Provide a text prompt instructing the model to edit the image Content promptcontent = new Content.Builder() .addImage(bitmap) .addText("Edit this image to make it look like a cartoon") .build(); // To edit the image, call `generateContent` with the prompt (image and text input) ListenableFuture<GenerateContentResponse> response = model.generateContent(promptcontent); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { // iterate over all the parts in the first candidate in the result object for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تکرار و ویرایش کردن تصویرها ازطریق گپ چندنوبتی
برای رویکردی مکالمهای در ویرایش تصویر، میتوانید از گپ چند نوبتی استفاده کنید. این کار امکان میدهد درخواستهای پیگیری برای اصلاح ویرایشها بدون نیاز به ارسال مجدد تصویر اصلی انجام شود.
ابتدا گپی با startChat() شروع کنید و درصورت تمایل سابقه پیام را ارائه دهید. سپس، برای پیامهای بعدی از sendMessage() استفاده کنید:
کاتلین
scope.launch { // Create the initial prompt instructing the model to edit the image val prompt = content { image(bitmap) text("Edit this image to make it look like a cartoon") } // Initialize the chat val chat = model.startChat() // To generate an initial response, send a user message with the image and text prompt var response = chat.sendMessage(prompt) // Inspect the returned image var generatedImageAsBitmap: Bitmap? = response .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image // Follow up requests do not need to specify the image again response = chat.sendMessage("But make it old-school line drawing style") generatedImageAsBitmap = response .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image }
جاوا
// Provide an image for the model to edit Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones); // Initialize the chat ChatFutures chat = model.startChat(); // Create the initial prompt instructing the model to edit the image Content prompt = new Content.Builder() .setRole("user") .addImage(bitmap) .addText("Edit this image to make it look like a cartoon") .build(); // To generate an initial response, send a user message with the image and text prompt ListenableFuture<GenerateContentResponse> response = chat.sendMessage(prompt); // Extract the image from the initial response ListenableFuture<Bitmap> initialRequest = Futures.transform(response, result -> { for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; return imagePart.getImage(); } } return null; }, executor); // Follow up requests do not need to specify the image again ListenableFuture<GenerateContentResponse> modelResponseFuture = Futures.transformAsync( initialRequest, generatedImage -> { Content followUpPrompt = new Content.Builder() .addText("But make it old-school line drawing style") .build(); return chat.sendMessage(followUpPrompt); }, executor); // Add a final callback to check the reworked image Futures.addCallback(modelResponseFuture, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
ملاحظات و محدودیتها
ملاحظات و محدودیتهای زیر را درنظر داشته باشید:
- قالب برونداد: تصاویر بهعنوان PNG با حداکثر ابعاد ۱۰۲۴ پیکسل تولید میشوند.
- انواع ورودی: این مدل از ورودیهای صوتی یا ویدیویی برای تولید تصویر پشتیبانی نمیکند.
- پشتیبانی از زبان: برای بهترین عملکرد، از زبانهای زیر استفاده کنید:
انگلیسی (
en)، اسپانیایی مکزیکی (es-mx)، ژاپنی (ja-jp)، چینی سادهشده (zh-cn)، و هندی (hi-in). - مشکلات تولید:
- تولید تصویر ممکن است همیشه راهاندازی نشود و گاهی اوقات منجر به برونداد فقط نوشتاری شود. سعی کنید صریحاً درخواست برونداد تصویر کنید (برای مثال، «تصویری تولید کن»، «همزمان با پیش رفتن، تصویر ارائه کن»، «تصویر را بهروز کن»).
- این مدل ممکن است تولید را در نیمه راه متوقف کند. دوباره امتحان کنید یا پیامواره دیگری را امتحان کنید.
- این مدل ممکن است نوشتار را بهصورت تصویر تولید کند. بهطور صریح درخواست برونداد نوشتاری کنید (برای مثال، «نوشتار روایی همراه با تصویرسازی تولید کن»).
برای جزئیات بیشتر، مستندات Firebase را ببینید.
مراحل بعدی
پساز راهاندازی برنامهتان، مراحل بعدی زیر را درنظر بگیرید:
- برنامه نمونه «شروع سریع Android Firebase» و کاتالوگ نمونه هوش مصنوعی Android را در GitHub مرور کنید.
- برنامهتان را برای تولید آماده کنید، ازجمله راهاندازی «بررسی برنامه Firebase» برای محافظت از Gemini API دربرابر سوءاستفاده مشتریان غیرمجاز.
- در اسناد Firebase درباره Firebase AI Logic بیشتر بدانید.