Как я могу инициализировать переменную bitmap в следующем коде?

#java #android-bitmap

#java #android-bitmap

Вопрос:

Я знаю, что есть такой вопрос о переполнении стека, но ответы просто не работают в моем коде.

Я также пытался использовать decodeStream() для получения растрового изображения, но я просто получаю те же результаты.

Единственный метод, который работает, это decodeResource() .

Я не могу использовать decodeResourse , потому что мне нужно декодировать постоянно меняющиеся изображения, которые я получаю во время выполнения, скриншоты

Весь следующий код находится в onstartCommand() методе службы

 Notification.Builder notificationBuilder = new Notification.Builder(this)
    .setSmallIcon(R.drawable.ic_launcher)
    .setContentTitle("My notification")
    .setContentText("Hello World!");
NotificationManager mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = notificationBuilder.build();
mNotificationManager.notify(1, notification);
startForeground(1,notification);

String path = "/data/data/com.mycompany.myapp/files";
File f = null;
BitmapFactory.Options options = null;
Bitmap bitmap = null;
try{
    //Request Su permission
    Process sh = Runtime.getRuntime().exec("su", null,null);
    OutputStream os = sh.getOutputStream();
    //Open an output stream to a private file to my app
    FileOutputStream fos = openFileOutput("img4.png", Context.MODE_PRIVATE);
    fos.write(("/system/bin/screencap -p "   
        "/data/data/com.mycompany.myapp/files/img4.png").getBytes("UTF-8"));
    fos.close();

    f=new File(path,"img4.png");
    options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    //decodeFile always returns null yet
    //I am sure that the file exsists
    bitmap = BitmapFactory.decodeFile(
        new File(getFilesDir(),"img4.png").getAbsolutePath(),
        options);
    os.flush();
    os.close();
    sh.waitFor();
}catch(Exception e){
    e.printStackTrace();
}
//I create and show a toast
Toast.makeText(getApplicationContext(),"Exs: "   f.exists() 
//I always get a nullPointerException here
    " "  bitmap.getPixel(0,0),Toast.LENGTH_SHORT).show();
 

Комментарии:

1. Ваш файл img4.png содержит строку «/system/bin/screencap -p /data/data/com.mycompany.myapp/files/img4.png» (потому что это то, что вы записываете в файл). Какую картинку вы ожидаете от этой строки?

2. Я определенно ожидаю, что изображение будет записано в путь «/data/ data/com.mycompany.myapp/ files», используя эту строку («/ system/ bin/screencap -p » «/data/ data/com.mycompany.myapp/files/img4.png»).getBytes(«UTF-8») . Позвольте мне объяснить, почему. Как только у меня есть разрешение su, эта строка делает снимок экрана и помещает его в определенный путь. Я попробовал строку («/system/ bin/screencap -p » «/storage/emulated/0/myscreenshots/img4.png»).getBytes(«UTF-8»), и он записал снимок экрана в путь /storage/emulated/0/myscreenshots . Вот почему я заменяю каталог на частное местоположение.

3. Кто-нибудь, пожалуйста, помогите. Я открыт для любых вопросов, которые у вас могут возникнуть. Это исключение NullPointerException меня напрягает.

4. Было бы записано изображение, если бы вы записывали эту строку в os OutputStream (и, следовательно, предоставляли ее в качестве команды вашей su оболочке). В том виде, в котором стоит ваш код, вы его записываете fos . И это FileOutputStream с «img4.png» в качестве цели.

5. Хорошо. Тогда объясните мне, почему эта строка, Bitmap bitmap = BitmapFactory.decodeFile(«/storage/emulated/0/myimage.jpeg «); также не создает растровое изображение, но я вручную помещаю тестовый файл (чтобы быть абсолютно уверенным, что он существует) в корень моего каталога через файловый менеджер.

Ответ №1:

Вы уверены, что ваши приложения проявляются (main/AndroidManifest.xml ) содержит android.permission.READ_EXTERNAL_STORAGE и что вы предоставили это разрешение на своем телефоне?


На моем старом (корневом) телефоне пример приложения работал без этого разрешения. На моем новом телефоне без рутов мне пришлось включить это разрешение, чтобы приложение заработало.