Android Studio: созданный файл с приложением, не виден по телефону, но внутреннее хранилищеJAVA

Программисты JAVA общаются здесь
Anonymous
Android Studio: созданный файл с приложением, не виден по телефону, но внутреннее хранилище

Сообщение Anonymous »

Я сделал приложение, которое создает файл PDF. Хотя файл успешно сгенерирован, он не отображается в файлах Google. Файл, как документ, должен отображаться в разделе документов Google Files, но это не так. Ни один из них не происходит при поиске файла для отправки через WhatsApp. Единственный способ найти его - это внутреннее хранилище, непрактичный способ. < /P>
Приложение не показывает никакой ошибки, поэтому у меня нет журнала ошибок. Это не происходит в эмуляторе, только в реальных телефонах. Я использую Android 14.

Код: Выделить всё

package com.example.receiptgenerator;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.pdf.PdfDocument;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
Button createPDFButton;

//EditText spaces
EditText dateText;
EditText groupText;
EditText cycleText;
EditText termText;
EditText feeText;
EditText capitalText;
EditText interestText;
EditText moratoriumText;
EditText fileText;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) ->  {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});

//Definition of EditText elements
dateText = findViewById(R.id.dateText);
groupText = findViewById(R.id.groupText);
cycleText = findViewById(R.id.cycleText);
termText = findViewById(R.id.termText);
feeText = findViewById(R.id.feeText);
capitalText = findViewById(R.id.capitalText);
interestText = findViewById(R.id.interestText);
moratoriumText = findViewById(R.id.moratoriumText);
fileText = findViewById(R.id.fileText);

createPDFButton = findViewById(R.id.button);
createPDFButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createButtonAction();
}
});
}

private void createButtonAction() {
try {
CreatePDF();
} catch (Exception e) {
Log.d("mylog", e.toString());
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}

private void CreatePDF() {
//This creates a PDFDocument
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(378, 567, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);

//This handles the drawing of things
Canvas canvas = page.getCanvas();
Typeface consoleFont = ResourcesCompat.getFont(getBaseContext(), R.font.inconsolata_regular);

//Paint1
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setTypeface(consoleFont);
paint.setTextSize(18);

//Paint2
Paint paint2 = new Paint();
paint2.setColor(Color.BLACK);
paint2.setTypeface(consoleFont);
paint2.setTextSize(18);
paint2.setTextAlign(Paint.Align.RIGHT);

//This handles the content
Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
Bitmap newBackground = Bitmap.createScaledBitmap(background, 378, 567, true);

//Text Strings
String dateTextString = dateText.getText().toString();
String groupTextString = groupText.getText().toString();
String cycleTextString = cycleText.getText().toString();
String termTextString = termText.getText().toString();
String feeTextString = feeText.getText().toString();
String capitalTextString = capitalText.getText().toString();
String interestTextString = interestText.getText().toString();
String moratoriumTextString = moratoriumText.getText().toString();

//Writes PDF content
canvas.drawBitmap(newBackground, 0, 0, new Paint(Color.WHITE));
canvas.drawText(dateTextString, 240, 145, paint);
canvas.drawText(groupTextString, 240, 170, paint);
canvas.drawText(cycleTextString, 240, 195, paint);
canvas.drawText(termTextString + " Semanas", 240, 220, paint);
canvas.drawText(feeTextString + "/"  + termText.getText().toString(), 210, 290, paint2);
if (capitalTextString.equals("") || interestTextString.equals("") || moratoriumTextString.equals("")) {

} else {
canvas.drawText(String.format("%.2f", Float.parseFloat(capitalTextString)), 350, 360, paint2);
canvas.drawText(String.format("%.2f", Float.parseFloat(interestTextString)), 350, 389, paint2);
canvas.drawText(String.format("%.2f", Float.parseFloat(moratoriumTextString)), 350, 418, paint2);

//totalText calc and writing
float total = Float.parseFloat(capitalText.getText().toString())
+ Float.parseFloat(interestText.getText().toString())
+ Float.parseFloat(moratoriumText.getText().toString());
canvas.drawText(String.format("%.2f", total), 350, 500, paint2);
}

document.finishPage(page);

File documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
String filename = fileText.getText().toString() + ".pdf";
if (fileText.getText().toString().equals("")) {
Toast.makeText(this, "Error: Write the file name.", Toast.LENGTH_SHORT).show();
} else if (dateTextString.equals("") || groupTextString.equals("") || cycleTextString.equals("")
|| termTextString.equals("") || feeTextString.equals("") || capitalTextString.equals("")
|| interestTextString.equals("") || moratoriumTextString.equals("")) {
Toast.makeText(this, "Error: Fill all fields.", Toast.LENGTH_SHORT).show();
} else {
File file = new File(documentsDir, filename);
try {
FileOutputStream fos = new FileOutputStream(file);
document.writeTo(fos);
document.close();
fos.close();
Toast.makeText(this, "Receipt created successfully.", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
Log.d("mylog", "Receipt failed " + e.toString());
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

}
}
Я попытался заменить getExternalStoragePublicDirectory () с помощью getExternalfilesdir (), создав конкретный каталог для приложения, но файл все еще невидим для остальных.

Подробнее здесь: https://stackoverflow.com/questions/797 ... al-storage

Вернуться в «JAVA»