RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-259287

Вячеслав's questions

Martin Hope
Вячеслав
Asked: 2021-12-02 12:55:54 +0000 UTC

如何选择要上传的文件并保存?

  • 0

Flutter Web 应用程序使用 ResumableJS 库将文件上传到服务器。是的,这不是最简单的解决方案,但它是必要的。当您选择一个文件(通常是一个图像)时,您必须在发送它之前在应用程序界面中显示它。但是,我无法在 Flutter 代码中获取图像文件本身,我不明白如何将其从库方法中提取出来并将其转换为任何合适格式的文件。这是我的 index.html 中的代码

<script src="https://cdn.jsdelivr.net/npm/resumablejs@1.1.0/resumable.min.js"></script>
<script>
  var apiUrl = "https://**********/api/";
  var progressBar = 0;
  var photoDescriptionUrl1 = "";
  var photoDescriptionUrl2 = "";
  var photoDescriptionUrl3 = "";
  var photoDescriptionUrl4 = "";
  var photoDescriptionUrl5 = "";
  var photoDescriptionUrl6 = "";
  var productPromoPictureURL = "";
  var productMiniPromoPictureURL = "";
  var productLogoURL = "";
  var nowUploading = [];

  //****** event for uploading **************
  document.addEventListener("uploadFile", function (event) {
    console.log("upload file ---- ", event.detail);
    initResumable(
      event.detail.fieldName,
      event.detail.userId,
      event.detail.fileType
    );
  });

  function initResumable(fieldName, userId, fileType) {
    var uploader = new Resumable({
      target: `${apiUrl}product/upload/${userId}`,
      chunkSize: 0.5 * 1024 * 1024,
      testChunks: false,
      prioritizeFirstAndLastChunk: true,
      maxFiles: 1,
    });
    uploader.opts.fileType = fileType;
    uploader.assignBrowse(document.getElementById(fieldName));

    uploader.on("fileAdded", (file, event) => {
      nowUploading.push(file.uniqueIdentifier);

      console.log("upload now...");
      uploader.upload();

      var event = new CustomEvent("uploadedFile", {
        detail: {
          file: file.file,
        },
      });
      console.log("file---", file);
      document.dispatchEvent(event);
    });

    uploader.on("fileSuccess", (file, message) => {
      console.log("uploaded ok", file, "for", fieldName);
      if (fieldName === "photoDescriptionUrl1R") {
        photoDescriptionUrl1 = file.fileName;
      } else if (fieldName === "photoDescriptionUrl2R") {
        photoDescriptionUrl2 = file.fileName;
      } else if (fieldName === "photoDescriptionUrl3R") {
        photoDescriptionUrl3 = file.fileName;
      } else if (fieldName === "photoDescriptionUrl4R") {
        photoDescriptionUrl4 = file.fileName;
      } else if (fieldName === "photoDescriptionUrl5R") {
        photoDescriptionUrl5 = file.fileName;
      } else if (fieldName === "photoDescriptionUrl6R") {
        photoDescriptionUrl6 = file.fileName;
      } else if (fieldName === "productLogoURL") {
        productLogoURL = file.fileName;
      } else if (fieldName === "productLauncherFileUrl") {
      } else if (fieldName === "productPromoPictureURL") {
        productPromoPictureURL = file.fileName;
      } else if (fieldName === "productLauncherFileUrl") {
      } else if (fieldName === "productMiniPromoPictureURL") {
        productMiniPromoPictureURL = file.fileName;
      } else if (fieldName === "productLauncherFileUrl") {
        this.form.productLauncher.get(fieldName).setValue(file.fileName);
      } else {
        this.form.setValue(file.fileName);
      }
      console.log("file URL is", file.fileName);
      return file.fileName;
    });
    uploader.on("pause", (file, message) => {
      console.log("pause", file, message);
    });
    uploader.on("fileProgress", (file, message) => {
      progressBar = uploader.progress();
      console.log("fileProgress", this.progressBar);
    });
    uploader.on("fileError", (file, message) => {
      console.log("fileError", file, message);
    });
  }
</script>

我想提请您注意,文件下载本身运行良好,没有问题和失败。这就是我在 dart 代码中使用库以获取 fileAdded 事件的方式:

html.document.on["uploadedFile"].listen((html.Event event) {
  var res = (event as html.CustomEvent).detail;
  var res1 = Map.from(res);
  var reet = res1.values.first;

  final reader = html.FileReader();
  reader.readAsText(reet);
  setState(() {
    image = Image.memory(reet);
  });

  print(res1.toString());
});

我的问题是我无法从响应中提取文件并将其转换为小部件所需的格式。给出错误信息

Uncaught Error: Expected a value of type 'Uint8List', but got one of type 'File$

请告诉我,我该怎么做?

javascript
  • 2 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-08-15 01:26:02 +0000 UTC

如何正确快速地从firestore获取信息?

  • 0

我正在写 Flutter + Firestore,有一项任务是从数据库中获取每种汽车维修类型的操作列表。也就是说,我首先获取所有类型的 TO 的列表,然后通过每个类型的 ID 在一个循环中转到 firestore 并获取操作列表。

速度问题,对于7种维护的列表,大约需要3-5秒,这对于用户来说是无法接受的。

这是我的功能代码:

class DashboardService {
  DataService dataService = DataService();

  getMarkers(List<Entry> entries, String carId) async {
    var _marker = []; // коллекция списков операций для каждого регламента ТО

    // Получаю списки операций для регламентов ТО
    for (int i = 0; i < entries.length; i++) {
      List<Operation> _operations = [];
      _operations =
          await dataService.getEntryOperations(entries[i].entryId, carId);
      _marker.add({'entry': entries[i], 'operations': _operations});

    }
    return _marker;
  }
}

添加这样组织的信息:

fs
    .document(docId)
    .collection('cars')
    .document(carId)
    .collection('entries')
    .document(entryId)
    .collection('operations')
    .document(operationRef.documentID)
    .setData(operationData);

如何优化和加速这个操作的执行?也许您需要更改信息存储的结构?

flutter
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-05-19 14:12:24 +0000 UTC

为什么服务器端请求不接受嵌套数组?

  • 0

我提出了一个向数据库添加记录的发布请求。标头被发送到服务器:

{pollTitle: "новый опрос", pollDescriprion: "для чего-то",…}
date: "19.05.2019"
pollDescriprion: "для чего-то"
pollTitle: "новый опрос"
questions: [{question: "Вы уверены в этом?", selectedMode: "radio",…},…]
0: {question: "Вы уверены в этом?", selectedMode: "radio",…}
question: "Вы уверены в этом?"
selectedMode: "radio"
variants: [{variantName: "да"}, {variantName: "нет"}]
0: {variantName: "да"}
1: {variantName: "нет"}
1: {question: "Может быть, все-таки не уверены?", selectedMode: "radio",…}
question: "Может быть, все-таки не уверены?"
selectedMode: "radio"
variants: [{variantName: "нет"}, {variantName: "конечно"}]
0: {variantName: "нет"}
variantName: "нет"
1: {variantName: "конечно"}
variantName: "конечно"
userId: "f9597165-2254-48ae-a4c2-f12fd4f4d5d1"

在服务器上我得到:

{ pollTitle: 'новый опрос',
  pollDescriprion: 'для чего-то',
  questions: 
   [ { question: 'Вы уверены в этом?',
       selectedMode: 'radio',
       variants: [Array] },
     { question: 'Может быть, все-таки не уверены?',
       selectedMode: 'radio',
       variants: [Array] } ],
  userId: 'f9597165-2254-48ae-a4c2-f12fd4f4d5d1',
  date: '19.05.2019' }

也就是说,带有答案选项的嵌套数组以 [Array] 条目的形式出现。

发送请求的服务代码:

  public post(url: string = '', data: any = {}): Observable<any> {
    return this.httpClient.post(this.getUrl(url), data);
  }

接收请求的服务器代码:

let body = ctx.request.body || {}
console.log('получаем - ', body)

告诉我如何获取包含全部信息的标题?

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-03-11 00:43:43 +0000 UTC

为什么排序在 mat-table 中不起作用?

  • 0

告诉我为什么在表格中排序不起作用,我按照Angular Material官方文档中的示例做所有事情

模板代码:

<h5 class="card-title">****************</h5>

<table mat-table [dataSource]="tabledata" matSort *ngIf="isLoaded">
  <ng-container matColumnDef="Фамилия, имя, отчество">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Фамилия, имя, отчество </th>
    <td mat-cell *matCellDef="let element"> {{element.name}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл P">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл P </th>
    <td mat-cell *matCellDef="let element"> {{element.skillP}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл A">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл A </th>
    <td mat-cell *matCellDef="let element"> {{element.skillA}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл E">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл E </th>
    <td mat-cell *matCellDef="let element"> {{element.skillE}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл I">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл I </th>
    <td mat-cell *matCellDef="let element"> {{element.skillI}} </td>
  </ng-container>
  <ng-container matColumnDef="Подразделение">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Подразделение </th>
    <td mat-cell *matCellDef="let element"> {{element.department}} </td>
  </ng-container>
  <ng-container matColumnDef="Должность">
    <th mat-header-cell *matHeaderCellDef> Должность </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

这是组件代码:

import { Component, OnInit, ViewChild } from '@angular/core';
import { Subscription, combineLatest } from 'rxjs';

import { PersonsService } from 'src/app/shared/services/persons.service';
import { PaeiService } from 'src/app/shared/services/paei.service';
import { Paei } from 'src/app/assessment/paei-test/models/paei.model';
import { Person } from 'src/app/shared/models/person.model';
import { MatTableDataSource, MatSort } from '@angular/material';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'mvv-paei-table',
  templateUrl: './paei-table.component.html',
  styleUrls: ['./paei-table.component.scss']
})

export class PaeiTableComponent implements OnInit {

  sub: Subscription;
  personsList: Person[] = [];
  paeiList: Paei[] = [];
  persons: {
    name: string,
    skillP: number,
    skillA: number,
    skillE: number,
    skillI: number,
    department: string,
    position: string
  }[] = [];

  tabledata: any;


  public displayedColumns = [
    'Фамилия, имя, отчество',
    'скилл P',
    'скилл A',
    'скилл E',
    'скилл I',
    'Подразделение',
    'Должность'
];
  isLoaded = false;

  constructor(
    private personsService: PersonsService,
    private paeiService: PaeiService,
  ) { }

  @ViewChild(MatSort) sort: MatSort;

  ngOnInit() {

    this.sub = combineLatest(
      this.personsService.getPersons(),
      this.paeiService.getAllPaei()
    ).subscribe(value => {
      value[0].forEach(doc => {
        const person = new Person(
          doc.data().name,
          doc.data().middleName,
          doc.data().surname,
          doc.data().gender,
          doc.data().date,
          doc.data().position,
          doc.data().department,
          doc.id
        );
        this.personsList.push(person);
      });

      value[1].forEach(doc => {
        const paei = new Paei(
          doc.data().id,
          doc.data().date,
          doc.data().skillP,
          doc.data().skillA,
          doc.data().skillE,
          doc.data().skillI,
          doc.data().isReaded
        );
        this.paeiList.push(paei);
      });
      for (let i = 0; i < this.paeiList.length; i++) {

        const pers = this.personsList.filter(
          res => res.personId === this.paeiList[i].id);
          const name = pers[0].surname + ' ' + pers[0].name + ' ' + pers[0].middleName;
          this.persons.push(
            {
              name: name,
              skillP: this.paeiList[i].skillP,
              skillA: this.paeiList[i].skillA,
              skillE: this.paeiList[i].skillE,
              skillI: this.paeiList[i].skillI,
              department: pers[0].department,
              position: pers[0].position
            }
          );

          this.tabledata = new MatTableDataSource(this.persons);

        }
        this.isLoaded = true;

        setTimeout(() => {
          this.tabledata.sort = this.sort;
          console.log('проверка сортировки', this.sort);
        }, 1000);

      });

  }

}

不要注意超时。

angular
  • 2 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-03-04 00:34:10 +0000 UTC

如何从 DocumentSnapshot 火库中获取对象属性?

  • 1

在服务中,我从 firebase 获取文档的 documentSnapshot。

  getBelbinById(id: string) {
    return this.afs.collection('belbin').doc(id).get();
  }

在我订阅此服务的组件中,通过订阅获取此文档快照:

this.sub = this.belbinService.getBelbinById(this.personId)
.subscribe((documentSnapshot: firebase.firestore.DocumentSnapshot) => {
  console.log(documentSnapshot.data());
}

这是我的问题开始的地方,因为我不能对数据做任何事情() - 无法访问对象的属性......对象本身具有表单并且通常显示在控制台中(看截图)

{ id: "ya1jibU2pZx1niGiuAmp"
  qwCF: [0, 0, 2, 0, 0, 6, 2]
  qwCO: [0, 0, 0, 0, 2, 0, 0]
  qwIMP: [10, 0, 2, 2, 2, 4, 0]
  qwME: [0, 4, 0, 4, 2, 0, 0]
  qwPL: [0, 0, 0, 0, 0, 0, 0]
  qwRI: [0, 2, 2, 2, 2, 0, 0]
  qwSH: [0, 0, 0, 0, 0, 0, 0]
  qwTW: [0, 4, 4, 2, 2, 0, 8] }

我脑袋坏了,为什么不能访问data()属性,告诉我是什么问题?我正在尝试像这样访问:

this.sub = this.belbinService.getBelbinById(this.personId)
.subscribe((documentSnapshot: firebase.firestore.DocumentSnapshot) => {
  this.id = documentSnapshot.data().id;
  this.qwCF = documentSnapshot.data().qwCF;
}
javascript
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-01-11 12:25:46 +0000 UTC

如何根据条件使 <material-radio> 不活动?

  • 0

有4组,每组4个。这是一个测试的 UI 组件,其中用户必须为 4 个问题中的每一个选择一个从 1 到 4 的分数(这里是该测试的模拟)。在这种情况下,总分不应超过 10 分。因此,我想让那些不活动,选择它们将导致不满足这个条件(就像上面显示的测试一样)。

例如,如果用户在前两行中选择了等级 4 和 4,那么在接下来的两个块中,应该让 1 个收音机处于活动状态。

这是模板代码:

<div>
    <div class="skillrow">{{skill_P}}</div>
    <div class="radiorow">
        <material-radio-group [(ngModel)]="selected_P">
            <material-radio *ngFor="let item of skillScore" [value]="item">
                {{ item }}
            </material-radio>
        </material-radio-group>
    </div>
</div>

<div>
    <div class="skillrow">{{skill_A}}</div>
    <div class="radiorow">
        <material-radio-group [(ngModel)]="selected_A">
            <material-radio *ngFor="let item of skillScore" [value]="item">
                {{ item }}
            </material-radio>
        </material-radio-group>
    </div>
</div>

<div>
    <div class="skillrow">{{skill_E}}</div>
    <div class="radiorow">
        <material-radio-group [(ngModel)]="selected_E">
            <material-radio *ngFor="let item of skillScore" [value]="item">
                {{ item }}
            </material-radio>
        </material-radio-group>
    </div>
</div>

<div>
    <div class="skillrow">{{skill_I}}</div>
    <div class="radiorow">
        <material-radio-group [(ngModel)]="selected_I">
            <material-radio *ngFor="let item of skillScore" [value]="item">
                {{ item }}
            </material-radio>
        </material-radio-group>
    </div>
</div>
angular2
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-02-06 11:45:56 +0000 UTC

使用硬件后退按钮在返回时结束 MediaPlayer

  • 3

在我的应用程序中,在查看幻灯片时实现了声音播放。当我更改幻灯片或使用主页按钮退出活动时,媒体播放器将终止。但是,如果我使用手机/平板电脑的硬件“返回”按钮退出幻灯片视图,MediaPlayer 仍然在后台运行,这与应用程序的逻辑不对应。
告诉我如何将 MediaPlayer 的停止“固定”到按下硬件“返回”按钮?

public class SliderActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    static final String TAG = "myLogs";
    ViewPager viewPager;
    CustomSwipeAdapter adapter;
    ToggleButton toggleButton;
    ImageButton imageButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_slider);
        imageButton = (ImageButton) findViewById(R.id.imageButtonHome);
        View.OnClickListener clickHome = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp !=null && mp.isPlaying()){
                    mp.stop();
                }
                GoHome();
            }
        };

        imageButton.setOnClickListener(clickHome);
/*
 * Читаем json и создаем из него объект книги bookFiles
 */
        Gson gson = new Gson();
        int bookId = GetBookId();
        String fileName = "book_" + bookId + ".json";
        String gsResult = MyJSON.getData(getApplicationContext(), fileName);
        BookFiles bookFiles = gson.fromJson(gsResult, BookFiles.class);

        final String folderB = "bookfiles_" + bookId;
        /*
        Получаем из объекта bookFiles массивы путей к файлам книги
         */
        ArrayList<String> pagesFiles = bookFiles.getPagesPath();
        final ArrayList<String> soundsFiles = bookFiles.getSoundsPath();

        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        adapter = new CustomSwipeAdapter(this, pagesFiles);
        viewPager.setAdapter(adapter);
        toggleButton = (ToggleButton) findViewById(R.id.imageButtonPlay);

        //слушаем номер слайда при перелистывании
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            Boolean first = true;
            @Override
            public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {
                if (first && positionOffset == 0 && positionOffsetPixels == 0){
                    onPageSelected(0);
                    first = false;
                }
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    int pagen = position+1;
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        viewPager.setCurrentItem(pagen, true);
                    }
                });

            }

            @Override
            public void onPageSelected(int position) {
                String nameS = Uri.parse(soundsFiles.get(position)).getLastPathSegment();
                if(mp != null){
                    mp.stop();
                }
                getMedia(nameS, folderB);
                toggleButton.setOnCheckedChangeListener(SliderActivity.this);

                if (toggleButton.isChecked()){
                    mp.start();

                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    public int GetBookId() {
        Intent intent = getIntent();
        int bookId = intent.getIntExtra("bookId", 1);
        return bookId;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) mp.start();
        else if (mp.isPlaying()) {
            mp.pause();
        }

    }

    public void getMedia(String nameS, String folderB) {
        try {
            final String soundPath = String.valueOf(getApplicationContext().getExternalFilesDir(folderB));
            final Uri souF = Uri.fromFile(new File(soundPath, nameS));
            final MediaPlayer mp = MyPlayer.getMp(getApplicationContext(), souF);
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void GoHome() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SliderActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 10);
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-02-01 19:35:23 +0000 UTC

下载文件时如何阻止活动?

  • 2

你好!我有一个活动,它有一个按钮可以从服务器下载一本书。当我单击它时,我想在下载文件时一直显示进度条。总而言之,一个典型的任务。但是加载了几个文件,使用. 而且我不知道如何在加载所有文件时阻止活动中的操作并显示进度条。该库在单独的线程中加载文件。也许我可以直接在 UI 线程中上传文件,而不需要库?那么在加载文件之前,用户肯定不会做任何事情。但这是一个坏主意,恕我直言,如果连接不是很好,它将失败。告诉我,往哪个方向去“挖”,或许有一些例子?

这是我加载文件并写入内存的方法:

private void downloadFilesBook(String[] urlsFiles) {
        mFetch = Fetch.newInstance(this);
        String folderB = "bookfiles_" + bookId;
        String fileNameForWrite = "book_" + bookId + ".json";

        File bookfolder = new File(String.valueOf(getExternalFilesDir(folderB)));
        ArrayList<String> pagesFiles = new ArrayList<>();

        for (int i = 0; i < urlsFiles.length; i++) {
            String url = urlsFiles[i];
            String path = String.valueOf(bookfolder);
            String fileName = Uri.parse(url).getLastPathSegment();
            Log.d("my2", fileName);
            Request request = new Request(url, path, fileName);
            String pageFilePath = path + "/" + fileName;
            Log.d("my2", pageFilePath);
            pagesFiles.add(pageFilePath);
            downloadId = mFetch.enqueue(request);
        }

        BookFiles bookFiles = new BookFiles();
        bookFiles.setBookID(bookId);

        ArrayList<String> pagesPath = getPagesArray(pagesFiles);
        ArrayList<String> soundsPath = getSoundsArray(pagesFiles);

        bookFiles.setPagesPath(pagesPath);
        bookFiles.setSoundsPath(soundsPath);
        Gson gson11 = new Gson();
        String filesJson = gson11.toJson(bookFiles);

        MyJSON.saveData(getApplicationContext(), filesJson, fileNameForWrite);
    }
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-01-30 14:58:58 +0000 UTC

如何以编程方式翻转 ViewPager?

  • 2

请告诉我如何在到达某个事件时以编程方式翻转 ViewPager 的页面。就我而言,当附加到页面的音频文件完成播放时。如果您需要查看实现,请使用以下代码:

public class SliderActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    static final String TAG = "myLogs";
    ViewPager viewPager;
    CustomSwipeAdapter adapter;
    ToggleButton toggleButton;
    ImageButton imageButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_slider);
        imageButton = (ImageButton) findViewById(R.id.imageButtonHome);
        View.OnClickListener clickHome = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp !=null && mp.isPlaying()){
                    mp.stop();
                }
                GoHome();
            }
        };

        imageButton.setOnClickListener(clickHome);
/*
 * Читаем json и создаем из него объект книги bookFiles
 */
        Gson gson = new Gson();
        int bookId = GetBookId();
        String fileName = "book_" + bookId + ".json";
        String gsResult = MyJSON.getData(getApplicationContext(), fileName);
        BookFiles bookFiles = gson.fromJson(gsResult, BookFiles.class);

        final String folderB = "bookfiles_" + bookId;
        /*
        Получаем из объекта bookFiles массивы путей к файлам книги
         */
        ArrayList<String> pagesFiles = bookFiles.getPagesPath();
        final ArrayList<String> soundsFiles = bookFiles.getSoundsPath();

        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        adapter = new CustomSwipeAdapter(this, pagesFiles);
        viewPager.setAdapter(adapter);
        toggleButton = (ToggleButton) findViewById(R.id.imageButtonPlay);

        //слушаем номер слайда при перелистывании
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                String nameS = Uri.parse(soundsFiles.get(position)).getLastPathSegment();
                if(mp != null){
                    mp.stop();
                }
                getMedia(nameS, folderB);
                toggleButton.setOnCheckedChangeListener(SliderActivity.this);

                if (toggleButton.isChecked()){
                    mp.start();
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        ViewPager.OnPageChangeListener listener = new ViewPager.SimpleOnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                String nameS = Uri.parse(soundsFiles.get(position)).getLastPathSegment();
                if(mp != null){
                    mp.stop();
                }
                getMedia(nameS, folderB);
                toggleButton.setOnCheckedChangeListener(SliderActivity.this);

                if (toggleButton.isChecked()){
                    mp.start();
                }
            }
        };

        viewPager.addOnPageChangeListener(listener);

        listener.onPageSelected(0);

    }

    public int GetBookId() {
        Intent intent = getIntent();
        int bookId = intent.getIntExtra("bookId", 1);
        return bookId;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) mp.start();
        else if (mp.isPlaying()) {
            mp.pause();
        }

    }

    public void getMedia(String nameS, String folderB) {
        try {
            final String soundPath = String.valueOf(getApplicationContext().getExternalFilesDir(folderB));
            final Uri souF = Uri.fromFile(new File(soundPath, nameS));
            final MediaPlayer mp = MyPlayer.getMp(getApplicationContext(), souF);
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void GoHome() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SliderActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 10);
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-01-10 01:26:40 +0000 UTC

不同屏幕分辨率上的 Framed ImageView 不保持纵横比

  • 0

您需要将图片保存在一个框架中,问题是在具有不同分辨率的设备上显示时。例如,图片显示了一个 nexus 和一个平板电脑

连结 4

药片

这是布局代码

*<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.yandex.matu1.toddlersbook.BookCardActivity">

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        app:srcCompat="@drawable/fonhdpi"
        tools:ignore="ContentDescription" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="40dp">

        <FrameLayout
            android:id="@+id/frameLayout"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:foreground="@drawable/framehdpi"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.488"
            tools:ignore="ContentDescription">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_margin="45dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.102"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.583"
                app:srcCompat="@drawable/cat1"
                tools:ignore="ContentDescription" />


        </FrameLayout>

        <Button
            android:id="@+id/button"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_weight="0.2"
            android:background="@drawable/buttonhdpi"
            android:scaleType="fitCenter"
            android:text="@string/download_text"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.555"
            app:layout_constraintStart_toEndOf="@+id/frameLayout"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.498"
            app:srcCompat="@drawable/buttonhdpi"
            tools:ignore="ContentDescription" />

    </LinearLayout>

</FrameLayout>*

你能告诉我如何使图片始终在框架中吗?

android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-12-24 02:32:44 +0000 UTC

无法获取 ViewPager 第一页的位置

  • 2

实现了 ViewPager 用于翻阅幻灯片,一切正常。OnPageChangeListener() 的问题在于,当第一次显示第一页时,它不会“听到”该页的位置。因此,当按下 ToggleButton 时,它无法开始播放 mp3 文件。适配器工作正常,显示第一页。

如果我向右滚动然后返回第一页 - 一切都很好,位置会返回。告诉我你怎么能处理这个?

public class SliderActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    static final String TAG = "myLogs";
    ViewPager viewPager;
    CustomSwipeAdapter adapter;
    ToggleButton toggleButton;
    ImageButton imageButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_slider);
        imageButton = (ImageButton) findViewById(R.id.imageButtonHome);
        View.OnClickListener clickHome = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp !=null && mp.isPlaying()){
                    mp.stop();
                }
                GoHome();
            }
        };

        imageButton.setOnClickListener(clickHome);
/*
 * Читаем json и создаем из него объект книги bookFiles
 */
        Gson gson = new Gson();
        int bookId = GetBookId();
        String fileName = "book_" + bookId + ".json";
        String gsResult = MyJSON.getData(getApplicationContext(), fileName);
        BookFiles bookFiles = gson.fromJson(gsResult, BookFiles.class);

        final String folderB = "bookfiles_" + bookId;
        /*
        Получаем из объекта bookFiles массивы путей к файлам книги
         */
        ArrayList<String> pagesFiles = bookFiles.getPagesPath();
        final ArrayList<String> soundsFiles = bookFiles.getSoundsPath();

        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        adapter = new CustomSwipeAdapter(this, pagesFiles);
        viewPager.setAdapter(adapter);
        toggleButton = (ToggleButton) findViewById(R.id.imageButtonPlay);

        //слушаем номер слайда при перелистывании
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                String nameS = Uri.parse(soundsFiles.get(position)).getLastPathSegment();
                if(mp != null){
                    mp.stop();
                }
                getMedia(nameS, folderB);
                toggleButton.setOnCheckedChangeListener(SliderActivity.this);

                if (toggleButton.isChecked()){
                    mp.start();
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    public int GetBookId() {
        Intent intent = getIntent();
        int bookId = intent.getIntExtra("bookId", 1);
        return bookId;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) mp.start();
        else if (mp.isPlaying()) {
            mp.pause();
        }

    }

    public void getMedia(String nameS, String folderB) {
        final String soundPath = String.valueOf(getApplicationContext().getExternalFilesDir(folderB));
        final Uri souF = Uri.fromFile(new File(soundPath, nameS));
        final MediaPlayer mp = MyPlayer.getMp(getApplicationContext(), souF);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }

    private void GoHome() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SliderActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 10);
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-12-19 23:45:26 +0000 UTC

获得权限后切换到另一个活动

  • 0

当应用程序启动时,我们会显示启动屏幕,并且还会请求读取/写入 SD 卡的权限。从开始的活动开始,2 秒后,有一个过渡到另一个活动。用户没有时间阅读权限请求,对话框仍然挂在应用程序“后面”。告诉我在处理权限请求对话框后如何转换到另一个活动?或者如何将请求对话框带到前台。这是活动代码:

public class WelcomeActivity extends AppCompatActivity {

    private ArrayList<String> urlsFromServer = new ArrayList<>();
    private ArrayList<Uri> filesPath = new ArrayList<>();
    private boolean CheckFileStorage = false;
    private final int MY_PERMISSIONS_REQUEST_CODE = 1;

    private String fileNamePath = "filesPath.json";

    private String urlServerJson = "http://*****.ru/todbook/booklist.json";

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        new ParseJsonServer().execute();
    }

    private class ParseJsonServer extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJsonServer = "";

        @Override
        protected String doInBackground(Void... params) {

            // получаем данные с внешнего ресурса

            try {
                URL url = new URL(urlServerJson);

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJsonServer = buffer.toString();

            } catch (Exception e) {
                e.printStackTrace();
            }

            return resultJsonServer;

        }

        @Override
        protected void onPostExecute(String strJson) {


            if (resultJsonServer != "") {
                urlsFromServer = GetListUrlCovers(resultJsonServer);

            } else {
                CheckListFile(fileNamePath);
                if (!CheckFileStorage) {
                    Toast toast = Toast.makeText(getApplicationContext(),
                            getString(R.string.NoInternetText), Toast.LENGTH_LONG);
                    toast.show();
                    NextActivity();

                } else {
                    NextActivity();
                }
            }

            CheckListFile(fileNamePath);

            if (CheckFileStorage) {

                String jsResult = MyJSON.getData(getApplicationContext(), fileNamePath);
                filesPath = getFilesPathFromFile(jsResult);

            } else {

                filesPath = new ArrayList<>();

                for (int i = 0; i < urlsFromServer.size(); i++) {
                    int d = i + 1;
                    String fileUrl = urlsFromServer.get(i);
                    String filenam = getApplicationContext().getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
                    FileLoader(fileUrl, filenam);
                }
                String strJs = new Gson().toJson(filesPath);

                if (!checkPermissions()) {
//                    Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
                    setPermissions();
                }

                MyJSON.saveData(getApplicationContext(), strJs, fileNamePath);
            }

            if (filesPath.size() == urlsFromServer.size()) {

                NextActivity();

            } else {
                try {
                    deleteFile(fileNamePath);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < urlsFromServer.size(); i++) {
                    int d = i + 1;
                    String fileUrl = urlsFromServer.get(i);
                    String filenam = getApplicationContext().getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
                    FileLoader(fileUrl, filenam);
                }
                String strJs = new Gson().toJson(filesPath);

                if (!checkPermissions()) {
                    setPermissions();
//                    Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
                }
/*
                else {
                    setPermissions();
                }
*/

                MyJSON.saveData(getApplicationContext(), strJs, fileNamePath);
                NextActivity();
            }
        }

    }

    private ArrayList<String> GetListUrlCovers(String strJson) {

        JSONObject dataJsonObj;

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray books = dataJsonObj.getJSONArray("books");

            for (int i = 0; i < books.length(); i++) {
                JSONObject book = books.getJSONObject(i);
                String url_book = book.getString("coverUrl");
                urlsFromServer.add(url_book);// пишу урлы в ArrayList
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urlsFromServer;
    }

    private void CheckListFile(String fileNameStorage) {
        File fileUrls = new File(getApplicationContext().getFilesDir().getPath() + "/" + fileNameStorage);

        if (fileUrls.exists()) {

            CheckFileStorage = true;

        }

    }

    private void FileLoader(String fileUrl, String filename) {

        if (!checkPermissions()) {
            setPermissions();
//            Toast.makeText(WelcomeActivity.this, "Разрешения уже получены", Toast.LENGTH_SHORT).show();
        }
/*
        else {
            setPermissions();
        }
*/

        ThinDownloadManager downloadManager = new ThinDownloadManager(5); //количество потоков загрузки
        Uri downloadUri = Uri.parse(fileUrl);
        Uri destinationUri = Uri.parse(filename);
        DownloadRequest downloadRequest = new DownloadRequest(downloadUri).setDestinationURI(destinationUri);
        downloadManager.add(downloadRequest);
        filesPath.add(destinationUri);
    }

    private ArrayList<Uri> getFilesPathFromFile(String jsResult) {
        ArrayList<Uri> urisImg = new ArrayList<>();
        try {
            JSONArray rootJson = new JSONArray(new JSONTokener(jsResult));
            for (int i = 0; i < rootJson.length(); i++) {
                JSONObject o = rootJson.getJSONObject(i);
                String strTo = (String) o.get("uriString");
                urisImg.add(Uri.parse(strTo));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urisImg;
    }

    private void NextActivity() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 2000);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode != MY_PERMISSIONS_REQUEST_CODE) {
            return;
        }
        boolean isGranted = true;
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                isGranted = false;
                break;
            }
        }

        if (isGranted) {
            Toast.makeText(WelcomeActivity.this, "Разрешения получены", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "В разрешениях отказано", Toast.LENGTH_LONG).show();

        }
    }

    private boolean checkPermissions() {
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
        return true;
    }

    private void setPermissions() {
        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE);
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-11-28 03:35:00 +0000 UTC

将 Json 文件写入和读取到设备内存

  • 0

有两种方法,一种是从服务器下载文件,然后将其写入设备的内存。使用 Fetch 库。第二种方法是读取文件。我不明白我的错误 - 正在创建文件,但是在读取它时,它给出了“”。根据日志,下载正常进行。

private void BookLoader(int bookId) {
    String bookIdJson = "http://****.ru/todbook/book" + bookId + ".json";
    Fetch bFetch;
    String folderJsB = getApplicationContext().getFilesDir().getPath();
    String fileName = "list_"+Uri.parse(bookIdJson).getLastPathSegment();
    Request request = new Request(bookIdJson, folderJsB, fileName);
    bFetch = Fetch.newInstance(getApplicationContext());
    bFetch.removeRequests();
    long resD = bFetch.enqueue(request);
    resD = 0;
}

这是读取方法代码

private String GetJson(String fileListBook) {
    try {
        File f = new File(getApplicationContext().getFilesDir().getPath() + "/" + fileListBook);
        //check whether file exists
        if(!f.exists()){
            return null;
        }
        FileInputStream is = new FileInputStream(f);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        return new String(buffer);

    } catch (IOException e) {
        Log.e("TAG", "Error in Reading: " + e.getLocalizedMessage());
        return null;
    }
}
android
  • 2 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-11-27 22:44:20 +0000 UTC

将多个文件上传到 AsyncTask 时出现问题

  • 0

帮助处理错误:在 RecyclerView 中,当您单击一个元素时,会转换到带有“下载”和“读取”按钮的活动。当您单击“加载”时,将启动 AsyncTask(加载 url 列表)。下载后,按钮变为非活动状态(条件是有一个包含下载文件的文件夹)。当您单击“阅读”时,将切换到另一个活动以查看图片。有条件 - 这是第一本书,它的文件供查看。因此,当您尝试下载第二本书时,表面上一切都很好,但无法查看文件 - 它们没有加载。在调试器中,我运行了两本书的下载周期——它工作不稳定,然后一个文件将加载七个文件,然后一切都完全正常。如果我清理应用程序数据,我首先加载的书可以正常工作。

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.tonyodev.fetch.Fetch;
import com.tonyodev.fetch.request.Request;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;

import ru.yandex.matu1.toddlersbook.models.Book;
import ru.yandex.matu1.toddlersbook.models.BookFiles;

public class BookCardActivity extends AppCompatActivity {
    static final String TAG = "myLogs";
    private int bookId;
    private String fileNamePath = "filesPath.json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book_card);

        BookUriFromId();

        String covers = MyJSON.getData(this, fileNamePath);
        ArrayList<String> coversPaths = getFilesPathFromFile(covers);

        ImageView imageView = (ImageView) findViewById(R.id.imageView);
        int posit = bookId-1;
        File imgFile = new File(coversPaths.get(posit));
        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
        imageView.setImageBitmap(myBitmap);

        Button buttonDownload = (Button) findViewById(R.id.button);
        Button buttonRead = (Button) findViewById(R.id.button2);

        String fileBookSt = "book_" + bookId + ".json";
        File fileOfBook = new File(getApplicationContext().getFilesDir().getPath() + File.separator + fileBookSt);

        if(fileOfBook.exists()){
            buttonDownload.setEnabled(false);
        }

        buttonDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Type itemsListType = new TypeToken<List<String>>() {
                }.getType();
                String folderB = "bookfiles_" + bookId;
                String fileBookStorage = "book_" + bookId + ".json";

                    BookLoader bookLoader = new BookLoader();
                    bookLoader.execute();

                    ArrayList<String> pagesPath;
                    ArrayList<String> soundsPath;
                    soundsPath = new ArrayList<>();


                    File bookfolder = new File(String.valueOf(getExternalFilesDir(folderB)));

                    if (!bookfolder.exists()) {
                        bookfolder.mkdirs();
                        Log.d("my", "dir. created");
                    }

                    try {
                        String result = bookLoader.get();
                        Gson gson = new Gson();
                        Book book = gson.fromJson(result, Book.class);
                        List<String> pages = book.getPageUrl();
                        String[] urlsPages = pages.toArray(new String[0]);

                        FileLoader fileLoader = new FileLoader();
                        fileLoader.execute(urlsPages);
                        String flResult = fileLoader.get();

                        pagesPath = new Gson().fromJson(flResult, itemsListType);

                        BookFiles bookFiles = new BookFiles();
                        bookFiles.setBookID(bookId);
                        bookFiles.setPagesPath(pagesPath);
                        bookFiles.setSoundsPath(soundsPath);

                        Gson gson11 = new Gson();
                        String filesJson = gson11.toJson(bookFiles);

                        MyJSON.saveData(getApplicationContext(), filesJson, fileBookStorage);

                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
//                }
            }
        });
    buttonRead.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NextActivity();
        }
    });

    }

    private class BookLoader extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJsonBook = "";
        private String bookIdJson = "http://*****.ru/todbook/book" + bookId + ".json";

        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL(bookIdJson);

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJsonBook = buffer.toString();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultJsonBook;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

    }

    private class FileLoader extends AsyncTask<String, Void, String> {
        Fetch mFetch;
        String folderB = "bookfiles_" + bookId;
        File bookfolder = new File(String.valueOf(getExternalFilesDir(folderB)));
        List<Request> requestListPages = new ArrayList<>();
        ArrayList<String> pagesPath = new ArrayList<>();
        String resultD;

        @Override
        protected String doInBackground(String... urlsFiles) {

            mFetch = Fetch.newInstance(getApplicationContext());
            mFetch.removeRequests(); //чистим базу запросов

            for (int i = 0; i < urlsFiles.length; i++) {
                String url = urlsFiles[i];
                String path = String.valueOf(bookfolder);
                String fileName = Uri.parse(url).getLastPathSegment();
                Log.d("my2", fileName);
                Request request = new Request(url, path, fileName);
                requestListPages.add(request);
                String pageFilePath = path + "/" + fileName;
                Log.d("my2", pageFilePath);
                pagesPath.add(pageFilePath);
            }

            mFetch.enqueue(requestListPages);
//            resultD = String.valueOf(pagesPath);
            String resultD = new Gson().toJson(pagesPath);
            return resultD;

        }

    }

    private void BookUriFromId() {
        //получаем номер ID книги, с обложки которой перешли в слайдер
        Intent intent = getIntent();
        bookId = intent.getIntExtra("bookId", 1);
        Log.d(TAG, "You read book №" + bookId);
    }

    private void NextActivity() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(BookCardActivity.this, SliderActivity.class);
                intent.putExtra("bookId", bookId); // передаю в слайдер номер книги

                startActivity(intent);
                finish();
            }
        }, 20);
    }

    private ArrayList<String> getFilesPathFromFile(String jsResult) {
        ArrayList<String> urisImg = new ArrayList<>();
        try {
            JSONArray rootJson = new JSONArray(new JSONTokener(jsResult));
            for (int i = 0; i < rootJson.length(); i++) {
                JSONObject o = rootJson.getJSONObject(i);
                String strTo = (String) o.get("uriString");
                urisImg.add(strTo);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urisImg;
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-11-07 02:15:36 +0000 UTC

如何在 RecyclerView 中从内存中加载图像?

  • 1

我尝试使用 Picasso 通过 uri 从内部存储器加载文件 它总是崩溃,给出错误 java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.ImageView Error on the line .load(uri ) 这是我的代码,请帮忙找出错误

import android.net.Uri;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

import it.sephiroth.android.library.picasso.Picasso;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final String LOG_TAG = "my_log";

    List<Cover> covers;

    RecyclerAdapter(List<Cover> covers) {
        this.covers = covers;
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView){
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Cover cover = covers.get(position);
        String filePath = String.valueOf(cover.getFileBookCover());
        Log.d(LOG_TAG, "Cover URI URI: " + filePath);
        Uri uri = cover.getFileBookCover();

        Picasso
                .with(holder.itemView.getContext())
                .load(uri)
                .into((ImageView) holder.itemView);

    }

    @Override
    public int getItemCount() {
        return covers.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        CardView cardView;
        ImageView imgObl;

        ViewHolder (View itemView) {
            super(itemView);
            cardView = itemView.findViewById(R.id.card_view);
            imgObl = itemView.findViewById(R.id.iv_recycler_item);
        }
    }


}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-11-07 00:44:16 +0000 UTC

为什么 ArrayList 会将其值重置为零?

  • 1

有一个方法 initData(urisImg) 应该创建一个 Cover 对象列表。输入是一个ArrayList urisImg,在onCreate方法中初始化,每次通过FileLoader()方法加载文件时填充值。我不明白为什么上传文件后我的 urisImg 列表大小变为零。也就是initData方法没有开始工作,因为urisImg列表是空的……请帮我找出错误。下面的代码

import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.thin.downloadmanager.DownloadRequest;
import com.thin.downloadmanager.ThinDownloadManager;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private String filename;
    private String fileUrl;
    private ArrayList<Uri> urisImg;
    private ArrayList<String> urls;

    private static final String LOG_TAG = "my_log";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        LinearLayoutManager llm = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(llm);
        recyclerView.setHasFixedSize(true);

        urisImg = new ArrayList<>();

        File file = new File(this.getCacheDir().getPath() + File.separator + "booklist.json");

        if (!file.exists()){
            new ParseBookCovers().execute();
        }
        else {
            CoverFormer(); //посмотреть потом, будет ли успевать выполнять код при большом количестве обложек
        }

        initializeAdapter();

    }

    private List<Cover> initData(ArrayList<Uri> urisImg) {
        ArrayList<Cover> covers = new ArrayList<>();
        for (int i=0; i<urisImg.size();i++){
            covers.add(new Cover(urisImg.get(i)));
        }
        return covers;
    }

    private void initializeAdapter() {
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(initData(urisImg));
        recyclerView.setAdapter(recyclerAdapter);
    }

    private void FileLoader(String fileUrl, String filename) {

        ThinDownloadManager downloadManager = new ThinDownloadManager(5); //количество потоков загрузки
        Uri downloadUri = Uri.parse(fileUrl);
        Uri destinationUri = Uri.parse(filename);
        DownloadRequest downloadRequest = new DownloadRequest(downloadUri).setDestinationURI(destinationUri);
        downloadManager.add(downloadRequest);
        urisImg.add(destinationUri);

    }

    private class ParseBookCovers extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJson = "";

        @Override
        protected String doInBackground(Void... params) {
            // получаем данные с внешнего ресурса
            try {
                URL url = new URL("http://******.ru/todbook/booklist.json");

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJson = buffer.toString();
                MyJSON.saveData(getApplicationContext(), resultJson);


            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultJson;
        }

        @Override
        protected void onPostExecute(String strJson) {
            CoverFormer();

        }
    }

    private ArrayList<String> GetListUrlCovers(String strJson) {

        JSONObject dataJsonObj;

        ArrayList<String> urls = new ArrayList<>();

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray books = dataJsonObj.getJSONArray("books");

            for (int i = 0; i < books.length(); i++) {
                JSONObject book = books.getJSONObject(i);
                String url_book = book.getString("coverUrl");
                urls.add(url_book);// пишу урлы в ArrayList urls
                Log.d(LOG_TAG, "coverUrl: " + url_book);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urls;
    }

    private void CoverFormer(){
        MyJSON.getData(getApplicationContext()); //read file json
        urls = GetListUrlCovers(MyJSON.getData(getApplicationContext())); // parse urls + write to array

        for (int i = 0; i < urls.size(); i++) {
            int d = i + 1;
            fileUrl = urls.get(i);
            filename = this.getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
            FileLoader(fileUrl, filename);
        }
    }

}
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-10-24 12:11:49 +0000 UTC

将什么参数传递给保存图像的方法?

  • 0

有这样一个代码,取自示例。我正在尝试使用它来将从互联网下载的图像保存在内部存储器中。

public void saveImage(Context context, Bitmap b, String imageName) {
    FileOutputStream foStream;
    try {
        foStream = context.openFileOutput(imageName, Context.MODE_PRIVATE);
        b.compress(Bitmap.CompressFormat.PNG, 100, foStream);
        foStream.close();
    } catch (Exception e) {
        Log.d("saveImage", "Exception 2, Something went wrong!");
        e.printStackTrace();
    }
}

请告诉我要传递给 Bitmap b 参数的内容,以便该方法有效。

android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-10-18 01:39:41 +0000 UTC

如何播放 ViewPager 页面的音频文件?

  • 0

ViewPager 显示了一系列滑动的图像。如何将音频文件的自动播放“附加”到每个图像?每张图片都有自己的音频文件,适配器代码如下:

public class CustomSwipeAdapter extends PagerAdapter {
    private int[] image_resourses = {
            R.drawable.eskiz_1, R.drawable.eskiz_2,
            R.drawable.eskiz_3, R.drawable.eskiz_4};
    private Context ctx;
    private LayoutInflater layoutInflatter;

    public CustomSwipeAdapter (Context ctx){
        this.ctx = ctx;
    }

    @Override
    public int getCount() {
        return image_resourses.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view==(LinearLayout)object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        layoutInflatter = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View item_view = layoutInflatter.inflate(R.layout.swipe_layout,container,false);
        ImageView imageView = (ImageView)item_view.findViewById(R.id.image_view);
        imageView.setImageResource(image_resourses[position]);
        container.addView(item_view);
        return item_view;

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

        container.removeView((LinearLayout)object);

    }
}
android
  • 2 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-09-23 01:07:13 +0000 UTC

如何减少项目 RecyclerView 之间的间距?

  • 0

你能告诉我如何减少 RecyclerView 列表项之间的距离吗?滚动是水平的,通过 LinearLayoutManager 在此处输入图像描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:weightSum="1">
    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_width="310dp"
        android:layout_height="220dp"
        android:layout_gravity="left"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="8dp"
        card_view:cardCornerRadius="5dp"
        card_view:cardElevation="5dp"
        card_view:contentPadding="10dp">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_recycler_item"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                tools:ignore="ContentDescription" />

        </LinearLayout>


    </android.support.v7.widget.CardView>
</LinearLayout>
android
  • 1 个回答
  • 10 Views
Martin Hope
Вячеслав
Asked: 2020-09-20 01:50:28 +0000 UTC

如何将 url 传递给 Book 类的新实例?

  • 0

如何在这段代码中将方法initData()传递url给对象Book?从服务器上Url解析。json

public class MainActivity extends AppCompatActivity {
    public static String LOG_TAG = "my_log";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        RecyclerAdapter adapter = new RecyclerAdapter(initData());
        recyclerView.setAdapter(adapter);

//        new ParseTask().execute();
    }


    private class ParseTask extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJson = "";

        @Override
        protected String doInBackground(Void... params) {
            // получаем данные с внешнего ресурса
            try {
                URL url = new URL("http://*********/todbook/booklist.json");

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJson = buffer.toString();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultJson;
        }

        @Override
        protected void onPostExecute(String strJson) {
            super.onPostExecute(strJson);
            // выводим целиком полученную json-строку
            Log.d(LOG_TAG, strJson);

            JSONObject dataJsonObj = null;

            try {
                dataJsonObj = new JSONObject(strJson);
                JSONArray books = dataJsonObj.getJSONArray("books");

                // 2. перебираем и выводим url обложек
                for (int i = 0; i < books.length(); i++) {
                    JSONObject book = books.getJSONObject(i);
                    String url_book = book.getString("coverUrl");
                    Log.d(LOG_TAG, "coverUrl: " + url_book);
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * массив для показа обложек книг
     */
    private List<Book> initData() {
        ArrayList<Book> books1 = new ArrayList<>();
        new ParseTask().execute();
        books1.add(new Book("wwww"));
        books1.add(new Book("wwww"));
        books1.add(new Book("wwww"));
        return books1;
    }
}
java
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5